A parte del conocido Zen de Python ( si no lo conoces, haz "import this"), hay otros, como el que ocurre cuando haces "import antigravity" (aunque solo funciona en Python 3 ), para los que no lo puedan probar... se abre el navegador en http://xkcd.com/353/ la traduccion:
Hasta otra!
miércoles, 17 de marzo de 2010
Otro huevo de pascua en Python
Etiquetas:
antigravedad,
easter egg,
huevo de pascua,
python,
tiras,
xkcd
domingo, 14 de marzo de 2010
SSH: Conexiones seguras para tod@s ( y III ) VPN's
Pues aqui esta la ultima parte de SSH: Conexiones seguras para tod@as, las VPN's, vamos alla...
[Nota]: en todo el proceso vas a necesitar privilegios de root
Preparando el terreno
Para poder utilizar un servidor SSH para hacer una VPN, tendremos que hacer algunos cambios:
El primero es cargar el modulo del kernel "tun" (si aparece al hacer lsmod|grep tun , no hace falta), esto se puede hacer con
Despues vamos a /etc/ssh/sshd_config y comprobamos que los parametros PermitRootLogin y PermitTunnel esten activados (yes)
Y reiniciamos el servidor SSH
Levantando la VPN
Se establece una conexion SSH con el servidor de una forma parecida a la que se utiliza para usarlo de proxy:
Las interfaces seran las que conecten la VPN, se pueden especificar a traves de un numero (que no puede estar en uso), o "any" (para utilizar la primera "no ocupada").
[Nota]: Siempre se va a necesitar una cuenta root en el servidor (ya que se crean nuevas interfaces)
Automaticamente, se crearan interfaces tunel (del tipo point to point) en el cliente y en el servidor (por ejemplo seran tun0 y tun1, aqui para abreviar,usaremos tunC para la del cliente y tunS para la del servidor)
Pues bien, una vez creadas hay que conectarlas, suponiendo que la VPN vaya a utilizar la subred 10.0.0.0, que el servidor vaya a utilizar la IP 10.0.0.1, y el cliente 10.0.0.9, habria que hacer:
En el cliente:
En el servidor:
(La "formula general" seria
Y ya esta, se acabo el SSH! (al menos por ahora ;)} )
[ Referencias ]
http://prefetch.net/
http://fermiparadox.wordpress.com/
[Nota]: en todo el proceso vas a necesitar privilegios de root
Preparando el terreno
Para poder utilizar un servidor SSH para hacer una VPN, tendremos que hacer algunos cambios:
El primero es cargar el modulo del kernel "tun" (si aparece al hacer lsmod|grep tun , no hace falta), esto se puede hacer con
modprobe tunDespues vamos a /etc/ssh/sshd_config y comprobamos que los parametros PermitRootLogin y PermitTunnel esten activados (yes)
Y reiniciamos el servidor SSH
Levantando la VPN
Se establece una conexion SSH con el servidor de una forma parecida a la que se utiliza para usarlo de proxy:
ssh -w <interface local>[:<interface remota>] [<usuario> @]<host>Las interfaces seran las que conecten la VPN, se pueden especificar a traves de un numero (que no puede estar en uso), o "any" (para utilizar la primera "no ocupada").
[Nota]: Siempre se va a necesitar una cuenta root en el servidor (ya que se crean nuevas interfaces)
Automaticamente, se crearan interfaces tunel (del tipo point to point) en el cliente y en el servidor (por ejemplo seran tun0 y tun1, aqui para abreviar,usaremos tunC para la del cliente y tunS para la del servidor)
Pues bien, una vez creadas hay que conectarlas, suponiendo que la VPN vaya a utilizar la subred 10.0.0.0, que el servidor vaya a utilizar la IP 10.0.0.1, y el cliente 10.0.0.9, habria que hacer:
En el cliente:
ifconfig tunC 10.0.0.9 pointopoint 10.0.0.1 En el servidor:
ifconfig tunS 10.0.0.1 pointopoint 10.0.0.9 (La "formula general" seria
ifconfig <interfaz tunel> <IP local> pointopoint <IP remota> )Y ya esta, se acabo el SSH! (al menos por ahora ;)} )
[ Referencias ]
http://prefetch.net/
http://fermiparadox.wordpress.com/
Etiquetas:
pointopoint,
ssh,
tun,
vpn
martes, 9 de marzo de 2010
Logo y colorines
Hace un par de dias que estoy trasteando con Logo [ en la wikipedia ] , un lenguaje de programacion diseñado con fines didacticos y que en este caso me parece interesante por que hace muy facil dibujar cosas en la pantalla, como lo que llaman "graficos de tortuga", lo de "tortuga" es por que el cursor era representado como una tortuga y se utiliza para referirse a el (a pesar de que en programas como ucblogo no sea una tortuga, sino simplemente una flecha )
[Nota:] probablemente haya una funcion para extraer la imagen, sino siempre os queda el Imprimir pantalla (como hice yo)
[Nota:] al final dejo unos cuantos interpretes, de todas formas, si usais un sistema Unix, casi seguro que podeis conseguir el ucblogo, ya sea por synaptic, port's o su pagina web ( http://www.eecs.berkeley.edu/~bh/logo.html )
No se necesitan muchas instrucciones para utilizarlo y pasar el rato, las instrucciones "basicas" son:
Para avanzar:
Para retroceder:
Para girar a la derecha:
Para girar a la izquierda:
Para volver a la posicion inicial:
Para limpiar la pantalla:
Para repetir instrucciones:
Para definir una nueva funcion:
Finalizar una funcion antes del
Ocultar la tortuga:
Mostrar la tortuga:
Condiciones:
Asi que, por ejemplo, para hacer una funcion que muestre un cuadrado, escribiriamos:
to cuadrado
forward 50
right 90
forward 50
right 90
forward 50
right 90
forward 50
right 90
end
o lo que es lo mismo:
to cuadrado
repeat 4[forward 50 right 90]
end
Esto dibujaria un cuadrado cada vez que se hace
...pero como hariamos para poder elegir la longitud de los lados ?
Veamos, las variables se usan con un ':', asi que...
[Nota:] en los dos casos se podria usar left en vez de right, como sabeis, lo importante es girar 90 grados, no importa la direccion
Y dibuja un cuadrado cuando se llama a
Ahora vamos a añadir algo mas, como hariamos una funcion que dibujara una figura con el numero de lados que queramos?
Seguramente ya se te haya ocurrido (no tiene demasiada dificultad precisamente :P), pero para quien no, ahi va la explicacion:
Si te fijas en la "formula del cuadrado", va asi (en pseudocodigo):
repite 4 veces [ avanza :longitud gira 90 ]
Conclusiones:
- Se repite el mismo numero de veces que lados hay (4)
- Los grados que se giran son los mismos que 360 (los de una vuelta completa) entre el numero de lados (hay que empezar y acabar en el mismo punto y con el mismo angulo)
Esta seria una posibilidad
Entonces, para hacer un triangulo de 100 de lado, solo habria que escribir
Y para un cuadrado
Y para un pentagono
... creo que ya pillais la idea :)
Vale, sigamos... si lo que queremos dibujar es un circulo, habria que hacer que de una vuelta de 360 grados, girando sin parar (por decirlo de alguna forma), verdad?
repeat 360[forward 1 right 1]
end
Y ahora... espirales :)
Para esto vamos a utilizar funciones recursivas, para quien no sepa lo que son, las funciones recursivas son las que se llaman a si mismas, por ejemplo el factorial:
si x es 0-> factorial(x)=1
sino-> factorial(x)=x*factorial(x-1)
Por supuesto, hay mas formas de hacerlo, pero esta forma de trabajar nos permitira hacer fractales mas adelante *-*
A lo que hiba, para dibujar una espiral se necesitan varios datos, en este caso vamos a usar la distancia del paso, el angulo de giro y un limite de tamaño, el pseudocodigo seria este:
Veamos detalladamente lo que hace:
Si ya pasamos el limite, ya acabamos
...
Sino
Estos dos no necesitan explicacion, no?
Y hacemos que la espiral siga avanzando, pero ahora, que la distancia sea mayor (para que se vaya "abriendo")
Si pasamos el codigo a Logo...
Asi, haciendo
Pero si cambiamos el angulo un poco...
Ademas, le podemos añadir alguna variable mas para controlarlo mejor
Esto añade la opcion de separar mas las lineas, por ejemplo, si a la primera figura se le pone 2 de separacion (1 es el que se usaba antes)...
o con el angulo cambiado...
Ahora a lo divertido... :D
Con esta funcion, y jugando con filtros de imagenes se pueden conseguir cosas bastante curiosas... por ejemplo:
Usando

Hasta otra!
[Interpretes]
UCBLogo ( http://www.eecs.berkeley.edu/~bh/logo.html ) (multiplataforma) [GPLv2]
XLogo ( http://xlogo.tuxfamily.org/sp ) (en Java) [GPL]
FMSLogo ( http://www.fmslogo.org ) ( para Windows ) [GPL]
[Referencias]
Wikipedia
http://neoparaiso.com/logo/
http://et.bgcbellevue.org/logo/
[Nota:] probablemente haya una funcion para extraer la imagen, sino siempre os queda el Imprimir pantalla (como hice yo)
[Nota:] al final dejo unos cuantos interpretes, de todas formas, si usais un sistema Unix, casi seguro que podeis conseguir el ucblogo, ya sea por synaptic, port's o su pagina web ( http://www.eecs.berkeley.edu/~bh/logo.html )
No se necesitan muchas instrucciones para utilizarlo y pasar el rato, las instrucciones "basicas" son:
Para avanzar:
forward <numero de pasos> (o fd <numero de pasos> )Para retroceder:
back <numero de pasos> (o bk <numero de pasos> )Para girar a la derecha:
right <grados que se gira> (o rt <grados que se gira> )Para girar a la izquierda:
left <grados que se gira> (o lt <grados que se gira>)Para volver a la posicion inicial:
homePara limpiar la pantalla:
cleanPara repetir instrucciones:
repeat <veces que se repite> '[' <Instrucciones que se repiten> ']'Para definir una nueva funcion:
to <nueva instruccion a definir> [:<argumento1>] ... [:<argumentoN>]
[instruccion] ... [instruccion] ENDFinalizar una funcion antes del
stop : stopOcultar la tortuga:
hideturtle ( o ht )Mostrar la tortuga:
showturtle ( o st )Condiciones:
if <condicion> '[' <acciones> ']'Asi que, por ejemplo, para hacer una funcion que muestre un cuadrado, escribiriamos:
to cuadrado
forward 50
right 90
forward 50
right 90
forward 50
right 90
forward 50
right 90
end
o lo que es lo mismo:
to cuadrado
repeat 4[forward 50 right 90]
end
Esto dibujaria un cuadrado cada vez que se hace
cuadrado con unos lados de 50 pasos...pero como hariamos para poder elegir la longitud de los lados ?
Veamos, las variables se usan con un ':', asi que...
to cuadrado :lado
repeat 4[ forward :lado right 90]
end
[Nota:] en los dos casos se podria usar left en vez de right, como sabeis, lo importante es girar 90 grados, no importa la direccion
Y dibuja un cuadrado cuando se llama a
cuadrado <tamaño> , por ejemplo, con cuadrado 200, dibuja un cuadrado con 200 pasos de ladoAhora vamos a añadir algo mas, como hariamos una funcion que dibujara una figura con el numero de lados que queramos?
Seguramente ya se te haya ocurrido (no tiene demasiada dificultad precisamente :P), pero para quien no, ahi va la explicacion:
Si te fijas en la "formula del cuadrado", va asi (en pseudocodigo):
repite 4 veces [ avanza :longitud gira 90 ]
Conclusiones:
- Se repite el mismo numero de veces que lados hay (4)
- Los grados que se giran son los mismos que 360 (los de una vuelta completa) entre el numero de lados (hay que empezar y acabar en el mismo punto y con el mismo angulo)
Esta seria una posibilidad
to figura :num_lados :distancia
repeat :num_lados [ forward :distancia right 360/:num_lados]
endEntonces, para hacer un triangulo de 100 de lado, solo habria que escribir
figura 3 100Y para un cuadrado
figura 4 100Y para un pentagono
figura 5 100... creo que ya pillais la idea :)
Vale, sigamos... si lo que queremos dibujar es un circulo, habria que hacer que de una vuelta de 360 grados, girando sin parar (por decirlo de alguna forma), verdad?
to circulorepeat 360[forward 1 right 1]
end
Y ahora... espirales :)
Para esto vamos a utilizar funciones recursivas, para quien no sepa lo que son, las funciones recursivas son las que se llaman a si mismas, por ejemplo el factorial:
si x es 0-> factorial(x)=1
sino-> factorial(x)=x*factorial(x-1)
Por supuesto, hay mas formas de hacerlo, pero esta forma de trabajar nos permitira hacer fractales mas adelante *-*
A lo que hiba, para dibujar una espiral se necesitan varios datos, en este caso vamos a usar la distancia del paso, el angulo de giro y un limite de tamaño, el pseudocodigo seria este:
para espiral :distancia :angulo :limite
si :distancia>:limite [para]
avanza :distancia
gira :angulo
espiral :distancia+1 :angulo :limite
Veamos detalladamente lo que hace:
si :distancia>:limite [para]Si ya pasamos el limite, ya acabamos
...
Sino
avanza :distancia
girar :anguloEstos dos no necesitan explicacion, no?
espiral :distancia+1 :angulo :limiteY hacemos que la espiral siga avanzando, pero ahora, que la distancia sea mayor (para que se vaya "abriendo")
Si pasamos el codigo a Logo...
to espiral :distancia :angulo :limite
if :distancia>:limite [stop]
forward :distancia
right :angulo
espiral :distancia+1 :angulo :limite
endAsi, haciendo
espiral 0 90 200 (un angulo de 90 para que sea cuadrado) conseguimos:Pero si cambiamos el angulo un poco...
espiral 0 91 200Ademas, le podemos añadir alguna variable mas para controlarlo mejor
to espiral :distancia :angulo :limite :incremento_distancia
if :distancia>:limite [stop]
forward :distancia
right :angulo
espiral :distancia+:incremento_distancia :angulo :limite :incremento_distancia
endEsto añade la opcion de separar mas las lineas, por ejemplo, si a la primera figura se le pone 2 de separacion (1 es el que se usaba antes)...
espiral 0 90 200 2o con el angulo cambiado...
espiral 0 91 200 2Ahora a lo divertido... :D
Con esta funcion, y jugando con filtros de imagenes se pueden conseguir cosas bastante curiosas... por ejemplo:
Usando
espiral 0 121 200 1 obtenemos esta imagen: Y usando un filtro "Olify" de la categoria "Artistic" (o "Pintura al oleo" de "Artistico") del GIMP:
Supongo que en estos casos (cuando se pierde informacion al aplicar el filtro) es mejor ampliar la imagen antes de usar el filtro, asi se notara menos ;)
Y si despues añadimos algo de color...

Ya esta :D!
PS: Tenia pensado hacer un script que cambiase el color de una imagen segun cuanta "luz" hay alrededor ( cuantas mas lineas blancas , mas "luz" ), para hacer efectos directamente con las imagenes de Logo, sin necesidad de un programa de manipulacion de imagen, pero se de imagenes lo que un gato de fisica cuantica, asi que no prometo nada :P
Hasta otra!
[Interpretes]
UCBLogo ( http://www.eecs.berkeley.edu/~bh/logo.html ) (multiplataforma) [GPLv2]
XLogo ( http://xlogo.tuxfamily.org/sp ) (en Java) [GPL]
FMSLogo ( http://www.fmslogo.org ) ( para Windows ) [GPL]
[Referencias]
Wikipedia
http://neoparaiso.com/logo/
http://et.bgcbellevue.org/logo/
Etiquetas:
colorines,
grafico,
logo,
pasando el rato
domingo, 7 de marzo de 2010
SSH: Conexiones seguras para tod@s ( II ) SSHFS
Siguiendo con la segunda parte de SSH: Conexiones seguras para tod@s, ahora SSHFS... la idea era mostrar tambien las VPN's, pero ahora mismo no es posible :(, prometo que pronto saldran ;)
SSHFS
¿ Que es SSHFS ?
Es un cliente que permite montar un sistema de archivos remoto en una carpeta local ("bajo la superficie", el cliente funciona con SFTP, con lo que las comunicaciones van cifradas adecuadamente)
Instalandolo
La instalacion es la tipica, no me voy a liar con esto, lo unico decir que usa FUSE, si no viene instalado por defecto (que me extraña), cualquier gestor de paquetes decente deberia instalarlo con sshfs, el resto es el clasico
Montando una carpeta
El comando para montar una carpeta es
Los parametros son:
Usuario: si el usuario es distinto en el host que el que se esta utilizando actualmente
Host: direccion a la que se conecta
Directorio: raiz de sistema de archivos (si es distinta al directorio HOME del usuario)
Puerto: si se usa un puerto SSH no estandar (distinto del 22)
Punto de montaje: carpeta local a traves de donde se accede al SSHFS
Como se puede ver, el comando es bastante parecido al de ssh, de hecho, si no se tiene la clave publica del host (o si ha cambiado), hace lo que haria ssh ( y pedira la clave del usuario )
Una vez montada, se puede navegar por la carpeta como si fuera una normal
Desmontando una carpeta
El comando para desmontar una carpeta es
El unico parametro, Punto de montaje, sirve para especificar la carpeta donde se monto el SSHFS
Y ya esta!
[Referencias]
http://tuxpepino.wordpress.com/
Hasta ahora!!
SSHFS
¿ Que es SSHFS ?
Es un cliente que permite montar un sistema de archivos remoto en una carpeta local ("bajo la superficie", el cliente funciona con SFTP, con lo que las comunicaciones van cifradas adecuadamente)
Instalandolo
La instalacion es la tipica, no me voy a liar con esto, lo unico decir que usa FUSE, si no viene instalado por defecto (que me extraña), cualquier gestor de paquetes decente deberia instalarlo con sshfs, el resto es el clasico
sudo apt-get install sshfs (para basados en debian, por ejemplo)Montando una carpeta
El comando para montar una carpeta es
sshfs [<usuario>@]<host>:[<directorio>] [-p <puerto>] <punto de montaje>Los parametros son:
Usuario: si el usuario es distinto en el host que el que se esta utilizando actualmente
Host: direccion a la que se conecta
Directorio: raiz de sistema de archivos (si es distinta al directorio HOME del usuario)
Puerto: si se usa un puerto SSH no estandar (distinto del 22)
Punto de montaje: carpeta local a traves de donde se accede al SSHFS
Como se puede ver, el comando es bastante parecido al de ssh, de hecho, si no se tiene la clave publica del host (o si ha cambiado), hace lo que haria ssh ( y pedira la clave del usuario )
Una vez montada, se puede navegar por la carpeta como si fuera una normal
Desmontando una carpeta
El comando para desmontar una carpeta es
fusermount -u <punto de montaje>El unico parametro, Punto de montaje, sirve para especificar la carpeta donde se monto el SSHFS
Y ya esta!
[Referencias]
http://tuxpepino.wordpress.com/
Hasta ahora!!
domingo, 28 de febrero de 2010
Peligros en el e-Mail
Hoy vamos a ver uno de los "peligros" del correo electronico, y no, no me refiero a el malware, ni al spam ni a nada asi (aunque lleva tanto tiempo ahi como ellos, o aun mas) , sino a algo que incluso se utiliza en correos legitimos (o al menos eso parecen)
Esto es, los correos con HTML
En un principio se podria pensar que esto no tiene nada de malo, se usa HTML en paginas web y no hay ningun problema, ¿verdad?... el problema esta en que se puede utilizar para obtener informacion que no suele ser bueno hacer publica, como la direccion IP utilizada
Veamos como funciona:
Mandamos un correo electronico a una direccion... usuario@example.org , cuando se abra el correo se mostrara el contenido en HTML (a menos que se configure el cliente de correo para que no lo haga) y al mostrar una imagen (por ejemplo), el cliente se conecta al servidor donde esta la imagen, que puede capturar informacion interesante del cliente como la IP, el navegador/cliente utilizado, etc...
Vamos alla, para esto usamos dos archivos, uno PHP (o lo que se utilize en el servidor web que se va a utilizar) y una imagen (o cualquier cosa que haga que el cliente se comunique con nuestro servidor, la imagen es lo mas sencillo y encaja perfectamente en un correo)
El archivo PHP solo tiene que hacer una cosa, guardar los datos del cliente y mandarle la imagen, un ejemplo seria:
Y ya esta, le enviamos el correo a alguien y...

El primero es abriendolo con el Thunderbird (como se puede ver en Navegador), y la segunda con un webmail (el navegador es Firefox)
Y ya tenemos la IP de a quien se le envio el correo
La siguiente vuelta de tuerca es hacer que en los logs tambien aparezcan las direcciones asociadas a cada IP, solo hay que añadir otra variable
Ahora ademas no se puede simplemente usar la imagen como antes (simplemente indicando su URL) ahora ademas hay que añadir ?mail=usuario@correo.aaa, por ejemplo, para mandarselo a "joe@gmail.com", utilizando la imagen http://aaa.com/imagen.php, habria que indicar http://aaa.com/imagen.php?mail=joe@gmail.com en la direccion de la imagen, el resultado es este:

Y en los dos casos el email parece completamente inofensivo:

Si, vale, no hay texto y la imagen que envie es de otro post, pero para mostrar la idea sirve
Tambien esta la opcion de incluir una imagen que solo tenga un pixel y que ademas es 100% transparente, asi que no se puede ver sin comprobar el codigo del mensaje
La solucion
La forma mas facil de evitar el problema (aparte de no abrir correos que no sean fiables) es deshabilitar el HTML en el cliente de correo (o en el webmail), Thunderbird, por ejemplo, pide confirmacion para leer HTML por defecto
Hasta otra!!
Esto es, los correos con HTML
En un principio se podria pensar que esto no tiene nada de malo, se usa HTML en paginas web y no hay ningun problema, ¿verdad?... el problema esta en que se puede utilizar para obtener informacion que no suele ser bueno hacer publica, como la direccion IP utilizada
Veamos como funciona:
Mandamos un correo electronico a una direccion... usuario@example.org , cuando se abra el correo se mostrara el contenido en HTML (a menos que se configure el cliente de correo para que no lo haga) y al mostrar una imagen (por ejemplo), el cliente se conecta al servidor donde esta la imagen, que puede capturar informacion interesante del cliente como la IP, el navegador/cliente utilizado, etc...
Vamos alla, para esto usamos dos archivos, uno PHP (o lo que se utilize en el servidor web que se va a utilizar) y una imagen (o cualquier cosa que haga que el cliente se comunique con nuestro servidor, la imagen es lo mas sencillo y encaja perfectamente en un correo)
El archivo PHP solo tiene que hacer una cosa, guardar los datos del cliente y mandarle la imagen, un ejemplo seria:
<?php
$fname="log.txt"; // archivo donde se guardan los logs
$f=fopen("$fname","a"); // Abrimos el archivo y lo preparamos
// para seguir escribiendo
fwrite($f,"IP: ".$_SERVER['REMOTE_ADDR']."\n"); // Guardamos la IP del cliente
fwrite($f,"Navegador: ".$_SERVER['HTTP_USER_AGENT']."\n"); // y tambien la
//informacion del cliente
fwrite($f,"---------------------\n"); // Para hacer el archivo mas facil de leer
fclose($f);
// Imagen a mostrar
$img="esfera.png";
// Redireccionamos al cliente a la imagen
header("Location: $img");
?>
Como se puede ver, el codigo es bastante simple, abrir un archivo, escribir un par de variables interesantes (en este caso, la IP y el cliente), y redireccionar el cliente a la imagen, se podria hacer que lea la imagen y la envie al cliente, que seria una solucion mas fiable (si alguien sigue la direccion de la imagen se dara cuenta del truco)Y ya esta, le enviamos el correo a alguien y...

El primero es abriendolo con el Thunderbird (como se puede ver en Navegador), y la segunda con un webmail (el navegador es Firefox)
Y ya tenemos la IP de a quien se le envio el correo
La siguiente vuelta de tuerca es hacer que en los logs tambien aparezcan las direcciones asociadas a cada IP, solo hay que añadir otra variable
<?php
$fname="log.txt"; // archivo donde se guardan los logs
$f=fopen("$fname","a"); // Abrimos el archivo y lo preparamos
// para seguir escribiendo
fwrite($f,"Direccion: ".$_REQUEST['mail']."\n");
fwrite($f,"IP: ".$_SERVER['REMOTE_ADDR']."\n"); // Guardamos la IP del cliente
fwrite($f,"Navegador: ".$_SERVER['HTTP_USER_AGENT']."\n"); // y tambien la
//informacion del cliente
fwrite($f,"---------------------\n"); // Para hacer el archivo mas facil de leer
fclose($f);
// Imagen a mostrar
$img="esfera.png";
// Redireccionamos al cliente a la imagen
header("Location: $img");
?>
Ahora ademas no se puede simplemente usar la imagen como antes (simplemente indicando su URL) ahora ademas hay que añadir ?mail=usuario@correo.aaa, por ejemplo, para mandarselo a "joe@gmail.com", utilizando la imagen http://aaa.com/imagen.php, habria que indicar http://aaa.com/imagen.php?mail=joe@gmail.com en la direccion de la imagen, el resultado es este:

Y en los dos casos el email parece completamente inofensivo:

Si, vale, no hay texto y la imagen que envie es de otro post, pero para mostrar la idea sirve
Tambien esta la opcion de incluir una imagen que solo tenga un pixel y que ademas es 100% transparente, asi que no se puede ver sin comprobar el codigo del mensaje
La solucion
La forma mas facil de evitar el problema (aparte de no abrir correos que no sean fiables) es deshabilitar el HTML en el cliente de correo (o en el webmail), Thunderbird, por ejemplo, pide confirmacion para leer HTML por defecto
Hasta otra!!
martes, 23 de febrero de 2010
Sockets multiplataforma
Un aperitivo mientras preparo algo mas interesante ;)}
Si alguien intento hacer un programa multiplataforma que hiciera uso de sockets se daria cuenta de que la unica diferencia en el manejo de estos entre Windows y los SO's basados en Unix es que el primero tiene una funcion adicional que hay que llamar para poder crear sockets, y otra para cuando se termine con su uso, y que se utilizan tipos de datos distintos (SOCKET en Windows y simplemente int en Unix).
Arreglar ese problema es sencillo, con un par de macros se soluciona el problema, aun asi, si prefieres evitar el trabajo de escribir el codigo, aqui lo tienes o descargalo de aqui [socket_wrapper] :
// -----------------------------------------------------------------
// Socket wrapper (aun que no estoy seguro de si se puede llamar asi)
#ifndef SOCKET_WRAPPER_H
#define SOCKET_WRAPPER_H
#ifdef _WIN32
#include <winsock.h>
#include <windows.h>
#define tsocket SOCKET
#define socket_init() WSADATA wsaData;\
WSAStartup(MAKEWORD(1,1),&wsaData);
#define socket_end() WSACleanup();
#else
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#define tsocket int
#define socket_init()
#define socket_end()
#endif
#endif
// Socket wrapper end
// En windows es necesario compilarlo con -lwsock32
// (para linkarlo a winsock)
// -----------------------------------------------------------------
Se usa como en Unix, pero el tipo de dato de los socket es tsocket y antes y despues de usar los socket hay que llamar a socket_init() y socket_end() respectivamente (en Unix no hara nada,pero en Windows llamara a las funciones necesarias).
Hasta otra
pd: No me olvide de SSHFS y las VPN
Si alguien intento hacer un programa multiplataforma que hiciera uso de sockets se daria cuenta de que la unica diferencia en el manejo de estos entre Windows y los SO's basados en Unix es que el primero tiene una funcion adicional que hay que llamar para poder crear sockets, y otra para cuando se termine con su uso, y que se utilizan tipos de datos distintos (SOCKET en Windows y simplemente int en Unix).
Arreglar ese problema es sencillo, con un par de macros se soluciona el problema, aun asi, si prefieres evitar el trabajo de escribir el codigo, aqui lo tienes o descargalo de aqui [socket_wrapper] :
// -----------------------------------------------------------------
// Socket wrapper (aun que no estoy seguro de si se puede llamar asi)
#ifndef SOCKET_WRAPPER_H
#define SOCKET_WRAPPER_H
#ifdef _WIN32
#include <winsock.h>
#include <windows.h>
#define tsocket SOCKET
#define socket_init() WSADATA wsaData;\
WSAStartup(MAKEWORD(1,1),&wsaData);
#define socket_end() WSACleanup();
#else
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#define tsocket int
#define socket_init()
#define socket_end()
#endif
#endif
// Socket wrapper end
// En windows es necesario compilarlo con -lwsock32
// (para linkarlo a winsock)
// -----------------------------------------------------------------
Se usa como en Unix, pero el tipo de dato de los socket es tsocket y antes y despues de usar los socket hay que llamar a socket_init() y socket_end() respectivamente (en Unix no hara nada,pero en Windows llamara a las funciones necesarias).
Hasta otra
pd: No me olvide de SSHFS y las VPN
Etiquetas:
C
lunes, 8 de febrero de 2010
SSH: Conexiones seguras para tod@s
Seguramente muchos conozcais telnet, una forma de conseguir una consola de comandos en un ordenador remoto, igualmente muchos sabreis que es inseguro por que va "en plano" por la red (un ordenador cualquiera de la red podria ver lo que pasa en el pc remoto, secuestrar la sesion o incluso capturar las contraseñas), por eso desde hace unos años (desde el 99) se utiliza SSH (secure shell), que utiliza conexiones seguras, peroo... sabiais que ademas de utilizarlo como una consola de comandos se puede utilizar para:
- Transferencias de archivos al estilo FTP
- Copia de archivos en red
- Cifrar casi cualquier tipo de conexion (todo lo que se pueda a traves de SOCKS: web, correo, mensajeria instantanea,... )
- Acceder a sistemas de archivos remotos como si fuesen locales (SSHFS)
- VPN (aunque mientras se escribe esto solo es posible con el cliente y el servidor de OpenSSH)
Para las pruebas se utilizo un servidor OpenSSH_5.3p1 y un cliente OpenSSH, el servidor puede necesitar alguna configuracion, pero la mayoria de las veces las distros/flavours ya lo traen listo para usar, ademas algunas cosas solo se pueden hacer con este servidor en concreto (OpenSSH)
Para intentar hacer todo mas claro, los comandos usaran
este tipo de letra, lo que vaya etiquetado <asi> es una campo ( por ejemplo <direccion del servidor> podria ser ssh.pruebas.com o 192.168.1.17 ), por ultimo lo que va entre ´[´ y ´]´ es opcional (se usa, entre otras cosas, para activar opciones adicionales)Empezando por lo basico:
Para abrir una consola de comandos en el servidor se utilizara el siguiente comando:
ssh [<usuario>@]<servidor> [-p <puerto>]La parte de
<usuario>@ solo es necesaria si se va a usar un usuario distinto al de la maquina local, y -p <puerto> se usa para acceder por un puerto no estandar (que es el 22).Este es un ejemplo posible:
Desde el pc 'vBox' el usuario 'kenkeiras' hace ssh al servidor 'sleepless' (
ssh sleepless), aqui en vez de haber utilizado el nombre del servidor se puede utilizar su ip... si es la primera vez que se conecta a este servidor se pedira al usuario que confirme que el fingerprint de la clave del servidor coincida con la real (para evitar que se produzca un ataque Man-in-the-middle, por ejemplo)Y despues la ejecucion seguiria como antes, pide la contraseña y abre la sesion del usuario.
Este comando (
ssh sleepless) es el mismo que ssh $USERNAME@sleepless -p 22 ya que se presupone que el usuario va a ser el mismo en el servidor que en el pc local y que el puerto va a ser el estandar (el 22).Manejando archivos:
Transferencia de archivos por SFTP (Secure File Transfer Protocol, Protocolo Seguro de Transferencia de Archivos) :
El uso de sftp es bastante sencillo, el comando de inicio es como el de ssh:
sftp [<usuario>@]servidor [-oPort=<puerto>]La unica diferencia es que para especificar un puerto diferente (el estandar sigue siendo 22, todo funciona a traves de ssh) se utiliza
-oPort , en vez de -pSe utliza como un cliente ftp normal, pero siempre se usa binary para las transferencias (para los que no lo entiendan, esto ultimo da igual)
Por ejemplo:
Los comandos basicos son:
cd <directorio>: Cambia al directorio especificado-
put <archivo local> [<archivo remoto>]: Envia un archivo 'archivo local' al servidor (si no se especifica el 'archivo remoto' se utilizara como nombre el de 'archivo local') get <archivo remoto> [<archivo local>]: Envia del servidor el 'archivo remoto' al pc local (si no se especifica el 'archivo local' se utiliza como nombre el de 'archivo remoto')mkdir <directorio>: Crea un directorio en el servidorls [<ruta>]: Muestra los contenidos del directorio actual (o si se especifica una ruta, de esa)rm <archivo>: Elimina el archivo 'archivo'rmdir <directorio>: Elimina el directorio 'directorio'exit: Salir!: Volver a la consola del pc local (cuando se salga de la consola se volvera a el SFTP)
SCP (Secure Copy, Copia Segura):
El comando basico de
scp es el siguiente scp [[<usuario>@]<servidor>:]<archivo origen> [[<usuario>@]<servidor>:]<archivo destino 1> [ [[<usuario>@]<servidor>:]<archivo destino 2> ... ] Es decir, el comando es
scp y en cada opcion se utiliza la siguiente notacion para definir un archivo:[[<usuario>@]<servidor>:]<archivo> Si el archivo esta (o se va a copiar) a otro pc, se escribe <servidor> : <archivo> , si el archivo es local, solo el nombre del archivo, y si el archivo esta en otro pc, pero se accede a traves de otro usuario, <usuario> @ <servidor> : <archivo> El primer archivo es el que se va a copiar y los demas es a donde se va a copiar, por ejemplo:
Aqui se copia un archivo ('example') del servidor 'sleepless', a el archivo local 'example'.
Las opciones son parecidas a la del programa
cp de unix, por ejemplo permite copiar directiorios enteros:Cifrando conexiones:
Si conoces el protocolo SOCKS sabras que sirve para hacer servidores proxy y clientes para cualquier protocolo que funcione sobre TCP/IP (con SOCKS5 tambien sobre UDP/IP, pero en este caso concreto no), ssh permite utilizarlo para cifrar conexiones entre el cliente y el servidor, para proteger los datos en la red que hay entre los dos (y que puede ser insegura), la idea es algo asi:
[Cliente SSH] ~~~~~~~~~> [Servidor SSH] --------------> [Destino]
Red insegura Red segura
(Cifrado) (sin cifrar)
Esto sirve por ejemplo para un portatil que esta conectado a una wifi y que tiene (ya dentro de la red con cable, protegida, ...) un servidor SSH, se tunelan los paquetes hasta el servidor (a la aplicacion lo trata como un simple proxy SOCKS), donde ya no es posible un ataque tan sencillo como usar un sniffer en una red WEP.
Para hacer esto usaremos
ssh -D [<ip de enlace>:]<puerto de enlace> [<usuario>@]< servidor> [-p <puerto para ssh>]Como se puede ver es igual que un comando
ssh con la diferencia de que se añade -D [<ip de enlace>:]<puerto de enlace>La opcion
-D significa que el tunelado sera dinamico (hay otras opciones que usan tunelado estatico, siempre al mismo pc y en el mismo puerto), sobre SOCKS.La
ip del enlace es opcional y sirve para concretar que interfaz de red se va a utilizar para la conexion, si no se especifica (o se usa un '*') cualquier pc en la red podra utilizar el tunel (esto puede ser util o no, dependiendo de las circunstancias), si no hay motivos para dejarlo abierto recomendaria utilizar 'localhost' (o '127.0.0.1') para permitir solo las conexiones locales.Y
puerto de enlace es el puerto que se proporcionara a los programas para que se conecten al tunelPor ejemplo:
ssh -D localhost:1234 sleeplessAbrira una conexion SSH con 'sleepless' y un tunel SSH que se puede acceder por 'localhost' y por el puerto '1234' (normalmente solo el superusuario tiene permiso para abrir puertos con un numero menor que 1024)
Y esto es todo por ahora... (proximamente el SSHFS y las VPN)
[Referencias]
http://www.openssh.org/
http://www.lucianobello.com.ar/openssh/
http://tuxpepino.wordpress.com/2007/05/11/ssh-el-dios-de-la-administracion-remota/
Hasta otra.
jueves, 28 de enero de 2010
Pasando el rato con /dev/dsp
/dev/dsp es el dispositivo que controla el audio en gnu/linux, esto permite hacer cosas bastante curiosas
(Si no encuentras el archivo dsp en la carpeta /dev, quiza este en dsp0, audio o audio0...)
Escribiendo cosas en este archivo conseguiremos que salgan como audio (lo mejor sera bajar el volumen del audio, ya vereis por que... ;)
Otra cosa... es posible que sea necesario cerrar las aplicaciones que esten utilizando el audio para que funcione todo bien, ademas esto es mejor lanzarlo en una consola de comandos (no con un "ejecutar programa") y despues pararlo con Control-C, sino es posible que siga hasta que se reinicie el pc.
Por ejemplo, haciendo sudo cat /dev/mouse >> /dev/dsp , los altavoces produciran un sonido cada vez que el mouse se mueve.
Con sudo cat /dev/urandom >> /dev/dsp se producira un sonido aleatorio... decepcionados?, yo tambien, lo de que fuera aleatorio tenia buena pinta, pero al final es lo que se escucha cuando la radio no esta sintonizada 
El resto es cuestion de imaginacion, hacer sudo cat /dev/hda >> /dev/dsp (o con sda en vez de hda si el disco es scsi)"reproducira" el disco duro, tambien se puede hacer con un archivo cualquiera, o con /dev/stdin (el teclado), /dev/mem (que es la memoria del pc)...
Tambien se puede hacer al reves, sudo cat /dev/dsp >> archivo.wav para guardar una grabacion (si el pc tiene microfono) en un archivo wav
Suerte y hasta otra
(Si no encuentras el archivo dsp en la carpeta /dev, quiza este en dsp0, audio o audio0...)
Escribiendo cosas en este archivo conseguiremos que salgan como audio (lo mejor sera bajar el volumen del audio, ya vereis por que... ;)
Otra cosa... es posible que sea necesario cerrar las aplicaciones que esten utilizando el audio para que funcione todo bien, ademas esto es mejor lanzarlo en una consola de comandos (no con un "ejecutar programa") y despues pararlo con Control-C, sino es posible que siga hasta que se reinicie el pc.
Por ejemplo, haciendo sudo cat /dev/mouse >> /dev/dsp , los altavoces produciran un sonido cada vez que el mouse se mueve.

El resto es cuestion de imaginacion, hacer sudo cat /dev/hda >> /dev/dsp (o con sda en vez de hda si el disco es scsi)"reproducira" el disco duro, tambien se puede hacer con un archivo cualquiera, o con /dev/stdin (el teclado), /dev/mem (que es la memoria del pc)...
Tambien se puede hacer al reves, sudo cat /dev/dsp >> archivo.wav para guardar una grabacion (si el pc tiene microfono) en un archivo wav
Suerte y hasta otra
Etiquetas:
GNU/linux,
pasando el rato,
sonido
jueves, 21 de enero de 2010
Marchando una de exploits!
Ya estamos acostumbrados a que los de Microsoft hagan de las suyas, dejando bugs explotables sin parchear y con ello dejando a sus usuarios solos ante el peligro, despues pasa lo que pasa, la historia de hoy no es diferente... vamos haya:
Las malas noticias:
1. (CVE-2010-0249) El bug en IE no es algo reciente (el 14 de este mes ya estaban los de McAfee hablando sobre el) ,pero aun sigue vigente:
Bug: permite a atacantes remotos ejecutar codigo arbitrario accediendo a un puntero asociado con un objeto borrado.
Son vulnerables IE6, IE7 y IE8, con Windows 2000 SP4, Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008, Windows 7 y Windows Server 2008 R2.
Simplemente navegando con uno de estos navegadores y SO's dentro de una pagina web hecha a proposito para explotar el bug permitiria acceso al sistema. (El exploit se puede conseguir a traves de Metasploit, por ejemplo)
Nota: antes se decia que con el DEP de IE, se evitaba la explotacion del bug, con el ultimo exploit esto ya no es verdad.
2. ( CVE-2010-0232 ) [Anuncio de la vulnerabilidad] El fallo en todos los Windows de 32 bits (a partir del NT)
Un fallo en todos los Windows debido a la forma en la que manejan las aplicaciones de 16 bits permite la explotacion para conseguir la elevacion de privilegios hasta SYSTEM (el usuario con mas privilegios de Windows).
En KiTrap0D.zip esta comprimido el exploit y el anuncio de la vulnerabilidad (en ingles)
Hay una extensa explicacion en el boletin de Hispasec: http://www.hispasec.com/unaaldia/4106/
Las buenas noticias:
Evitar los problemas es relativamente facil, para el bug de IE, puedes instalar otro navegador (como recomiendan los gobiernos Aleman y Frances): Firefox, Google Chrome, Opera o desactivar el Javascript.
Para evitar el Bug de Windows hay que deshabilitar el soporte para aplicaciones de 16 bits (que ya no se usan), aqui hay un video que indica como hacerlo en XP:
http://www.youtube.com/watch?v=u7Y6d-BVwxk
Suerte y hasta otra
Las malas noticias:
1. (CVE-2010-0249) El bug en IE no es algo reciente (el 14 de este mes ya estaban los de McAfee hablando sobre el) ,pero aun sigue vigente:
Bug: permite a atacantes remotos ejecutar codigo arbitrario accediendo a un puntero asociado con un objeto borrado.
Son vulnerables IE6, IE7 y IE8, con Windows 2000 SP4, Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008, Windows 7 y Windows Server 2008 R2.
Simplemente navegando con uno de estos navegadores y SO's dentro de una pagina web hecha a proposito para explotar el bug permitiria acceso al sistema. (El exploit se puede conseguir a traves de Metasploit, por ejemplo)
Nota: antes se decia que con el DEP de IE, se evitaba la explotacion del bug, con el ultimo exploit esto ya no es verdad.
2. ( CVE-2010-0232 ) [Anuncio de la vulnerabilidad] El fallo en todos los Windows de 32 bits (a partir del NT)
Un fallo en todos los Windows debido a la forma en la que manejan las aplicaciones de 16 bits permite la explotacion para conseguir la elevacion de privilegios hasta SYSTEM (el usuario con mas privilegios de Windows).
En KiTrap0D.zip esta comprimido el exploit y el anuncio de la vulnerabilidad (en ingles)
Hay una extensa explicacion en el boletin de Hispasec: http://www.hispasec.com/unaaldia/4106/
Las buenas noticias:
Evitar los problemas es relativamente facil, para el bug de IE, puedes instalar otro navegador (como recomiendan los gobiernos Aleman y Frances): Firefox, Google Chrome, Opera o desactivar el Javascript.
Para evitar el Bug de Windows hay que deshabilitar el soporte para aplicaciones de 16 bits (que ya no se usan), aqui hay un video que indica como hacerlo en XP:
http://www.youtube.com/watch?v=u7Y6d-BVwxk
Suerte y hasta otra
Etiquetas:
exploits,
pentesting
martes, 12 de enero de 2010
Diversion con los intrusos
Vuelta de navidades... hay gente que para pasar el tiempo libre se dedica a entrar en redes Wifi, veamos como sacar algo de diversion nosotros tambien :)}
El codigo que muestra informacion sobre el "visitante" es casi igual que el de la imagen que muestra ip, navegador...
Para que el dnsspoof funcione tiene que poder snifar las peticiones DNS, asi que dependiendo de la red quiza sea necesario poner en marcha un man-in-the-middle, para esto se utilizara otra herramienta de la suite dsniff, arpspoof, el comando es este: sudo arpspoof -i <interfaz> -t <ip de pasarela> <"visitante" >
Suerte y hasta otra
Supongamos que la situacion es la siguiente: eres propietari@ de una red Wifi, red que ha sido vulnerada (maldito WEP >:( ) y que el intruso utiliza para navegar por internet... asi que vamos a gastarle una pequeña broma
Nota: No soy abogado ni nada parecido, asi que no se si esto que se describe es totalmente legal aqui o en otro pais, las pruebas las he realizado en mi red privada, sin afectar a usuarios externos, si de verdad le vas a gastar una broma (que la cosa no pasa de eso) a alguien de tu red local, hazlo bajo tu responsabilidad.
Bien, pasemos a lo que hace falta:
- Un servidor web, para mostrarles la pagina web a los "visitantes", un Ubuntu con apache y php servira perfectamente
- La suite dsniff (concretamente la herramienta dnsspoof), en un entorno Ubuntu/Debian se puede instalar con sudo apt-get install dsniff
Lo primero es preparar la pagina que va a ver el "visitante", una o dos cosas apovechando la variable $_SERVER haran la pagina mas interesante, esta es bastante simple, todo es cuestion de hecharle imaginacion:
El codigo que muestra informacion sobre el "visitante" es casi igual que el de la imagen que muestra ip, navegador...
Por ultimo redireccionar a los visitantes de otro servidor, el comando que se utiliza es el siguiente: sudo dnsspoof -i <interfaz> -f <archivo de hosts>
Siendo el interfaz el dispositivo utilizado para conectarse a la red (como eth0 ,en Gnu/Linux, *BSD,etc se puede averiguar con ifconfig )
Y el archivo de hosts uno como el de /usr/share/dsniff/dnsspoof.hosts, siguiendo el formato clasico hay un dominio en cada linea, lo primero es la IP a la que se asigna el dominio, que va despues de la IP separado por una tabulacion (las lineas que empiezan por # son comentarios).
Lo que se consigue con esto es (por decirlo de una forma) que cuando el navegador pregunte en que IP esta alguno de los dominios de la lista, el dnsspoof se adelante al servidor DNS (aprovechando que la red local suele ser mas rapida) y le diga la IP que aparece en el archivo de hosts
Lo que se consigue con esto es (por decirlo de una forma) que cuando el navegador pregunte en que IP esta alguno de los dominios de la lista, el dnsspoof se adelante al servidor DNS (aprovechando que la red local suele ser mas rapida) y le diga la IP que aparece en el archivo de hosts
Para que el dnsspoof funcione tiene que poder snifar las peticiones DNS, asi que dependiendo de la red quiza sea necesario poner en marcha un man-in-the-middle, para esto se utilizara otra herramienta de la suite dsniff, arpspoof, el comando es este: sudo arpspoof -i <interfaz> -t <ip de pasarela> <"visitante" >
Suerte y hasta otra
Etiquetas:
dns,
pasando el rato,
web
Suscribirse a:
Entradas (Atom)



















