23 de mayo de 2010

Reto 12 de ESET-LA

ESET Latino América realiza habitualmente diversos retos para hacer pensar a sus lectores.

El reto 12 de ESET trata de hacer que dos robots colisionen en una linea infinita. Os invito a ver la descripción original en el sitio de ESET Latino América en http://blogs.eset-la.com/laboratorio/2010/05/22/desafio-12-eset/

El principal problema que tenemos es que la linea al ser infinita evita que si ambos robots van en la misma dirección puedan colisionar, por tanto lo primero que tenemos que hacer es pensar como podemos hacer para acotar la linea.

Como desconocemos si el otro robot está a izquierda o a derecha, tendremos que ir mirando a uno y otro lado para ver si encontramos la marca (de aceite) del robot que buscamos y así poder acotar el recorrido.
Para esto tenemos que hacer una busqueda primero hacia un lado y luego hacia otro, asta encontar las marcas. Y luego ir siempre por este camino.

Para esto vamos ha hacer "bibar" sobre la marca de aceite a los robots e iremos incrementando su recorrido.

IZQ - Mover a izquierda
DER - Mover a derecha
¿ACEITE? - Evitar la siguiente instrucción si existe aceite en donde estoy
GOTO - Ir a etiqueta

Code Pseudolenguaje:
F_CONT = 0
F_MOV = FALSE
CONT = 1
MODO = FALSE

IR:
SI F_CONT > 0:
CONT = F_CONT;
MODO = F_MOV;

PARA CONT:
SI MODO:
IZQ;
SINO:
DER;
FINPARA

¿ACEITE?
GOTO VUELVE;
GOTO FOUND;

FOUND:
F_CONT = CONT;
F_MOV = MODO;

VUELVE:
MODO = !MODO;
PARA CONT:
SI MODO:
IZQ;
SINO:
DER;
FINPARA
CONT = CONT + 1;
GOTO IR;

19 de mayo de 2010

Native Client SDK

Native Client SDK es un nuevo proyecto de Google para tratar de hacer más pontete la web.

La idea de Google es poder ejecutar código nativo desde la web. De este modo se pude aunmentar el portencial de las aplicaciones web dado que JavaScript no tiene la potencia que puden tener otros lenguajes.

Con esta iniciativa se dá más poder a los desarroyadores para poder acceder a más partes de la maquina de quien accede a ellas.

Bajo mi punto de vista este desarroyo puede tener implicaciones graves de seguridad; dado que los nuevos Virus, Troyanos y demás malware podría aprovechar esta tecnología para hacerse más potentes, dado que ya no tendrán que explotar vulnerabilidades de los navegadores, sino que podrán ejecutarse directamente.

Os dejo el video del proyecto:



Más Info:
http://code.google.com/p/nativeclient-sdk/

16 de mayo de 2010

Reto 2 de "forensicscontest.com"

En el segundo reto forense, vamos a buscar indicios que ayude a la policía a encontrar a un fugitivo (Ann).

Ann ha comunicado a su amante donde se va ha esconder. Para poder descubirlo tendremos que buscar la información que ha sido enviada por correo de Ann a su amante.

Las preguntas que tenemos que responder son:

1. ¿Cuál es la dirección de correo electrónico de Ann?
2. ¿Cuál es la contraseña de correo electrónico de Ann?
3. ¿Cuál es la dirección de correo electrónico del amante secreto de Ann?
4. ¿Qué dos elementos pide Ann a su amante secreto?
5. ¿Cuál es el nombre del archivo adjunto enviado Ann a su amante secreto?
6. ¿Cuál es la suma md5 del archivo adjunto enviado Ann a su amante secreto?
7. ¿En qué ciudad y país es su punto de encuentro?
8. ¿Cuál es la suma md5 de la imagen incrustada en el documento?

Dado que nuestra misión es interceptar un correo vamos a filtrar el trafico SMTP (Filtro [smpt]).
A continución vamos ver la primeta traza (Filtro [tcp.stream eq 2]).

En ella podemos ver que existe una conexión a un servicio de correo de "aol.com"

De esta trama destacaré:
EHLO annlaptop
...
AUTH LOGIN
334 VXNlcm5hbWU6
c25lYWt5ZzMza0Bhb2wuY29t
334 UGFzc3dvcmQ6
NTU4cjAwbHo=
235 AUTHENTICATION SUCCESSFUL
MAIL FROM: <sec558@gmail.com>
...

En este punto se puede ver como se autentica contra el servidor. El contenido se encuentra cifrado en Base64
EHLO annlaptop
...
AUTH LOGIN
334 Username:
sneakyg33k@aol.com
334 Password:
558r00lz
235 AUTHENTICATION SUCCESSFUL
MAIL FROM: <sec558@gmail.com>

Pero este primer mensaje no nos dá ninguna pista de su ubicación, por tanto vamos a por la siguiente trama interesante.

Podemos saver cuando se ha enviado otro correo por el saludo al servidor (Filtro [tcp.stream eq 3]).

En este mensaje, dirigido a "mistersecretx@aol.com" podemos ver que se hace referencia a un pasaporte y que se ha adjuntado un documento "secretrendezvous.docx"

Si abrimos el fichero docx podemos ver un mapa del sitio donde se piensan fugar.

Teniendo todos estos datos vamos a empezar a contestar las preguntas.

1. sneakyg33k@aol.com
2. 558r00lz
3. mistersecretx@aol.com
4. ... Bring your fake passport and a bathing suit. ...
5. secretrendezvous.docx
6. 9e423e11db88f01bbff81172839e1923
7. "Playa del Carmen, Mexico"
Para responder a la pregunta octaba podemos cambiar la extensión del fichero docx a zip y en la carpeta "word/media" la imagen que nos interesa.
8. aadeace50997b1ba24b09ac2ef1940b7

Fuente original (Ingles):
http://forensicscontest.com/2009/10/10/puzzle-2-ann-skips-bail

12 de mayo de 2010

Network Security Monitoring

Este martes he estado asistiendo a unas jornadas en el Parte Tecnológico de Andalucía sobre seguridad.

La charla se dividía en dos partes; la primera sobre APT (Avanced Persistent Threats, nada que ver con la herramienta Linux) y la segundas sobre NSM (Network Security Monitoring).

Personalmente me ha gustado gratamente la charla sobre NSM, quizás porque tenía muy visto los ataques APT, dada la moda de este tipo de ataques y el boom de textos sobre este tema, tras los ataques a Google y otras empresas, sufridos supuestamente por China.

Bueno a lo que vamos.

En la jornada se vió un pequeño ejemplo sobre un reto realizado por el SANS, en concreto el siguiente: http://forensicscontest.com/2009/09/25/puzzle-1-anns-bad-aim.

En este reto nos dan un preludio y un fichero pcap con las tramas que nos interesan.

En este caso se trata de una empresa que cree que uno de sus empleados les ha robado su receta secreta. Además han detectado un acceso extraño por su red WiFi. Tu objetivo es resolver las siguientes preguntas:

1. ¿Cuál es el nombre del compañero de Ana de mensajería instantánea?
2. ¿Cuál fue el primer comentario en la conversación de mensajería instantánea capturada?
3. ¿Cuál es el nombre del archivo transferido Ann?
4. ¿Cuál es el número mágico del archivo que desea extraer (los cuatro primeros bytes)?
5. ¿Cuál fue la suma md5 del archivo?
6. ¿Cuál es la receta secreta?

Para realizar la primera parte de este ejercicio vamos a usar Wireshark.
Como sabemos la IP del implicado es 192.168.1.158. Podemos filtar para solo ver el contenido relacionado con el implicado (Filtro [ip.addr == 192.168.1.158]). Si seguimos el flujo de la primera traza TCP podemos ver la (Filtro [tcp.stream eq 2]) conversación. Esto nos resuelve varias dudas.
: Here's the secret recipe... I just downloaded it from the file server. Just copy to a thumb drive and you're good to go >:-)
: recipe.docx
Sec558user1: thanks dude
Sec558user1: can't wait to sell it on ebay
: see you in hawaii!

Con esta conversación ya savemos varias cosas.
1. Sec558user1
2. Here's the secret recipe... I just downloaded it from the file server. Just copy to a thumb drive and you're good to go >:-)
3. recipe.docx

Para responder a la cuarta pregunta tendremos que buscar cual es el número mágico de los ficheros docx.
4. 0x50 0x4B 0x03 0x04 en ASCII "PK"

Para obtener el fichero vamos a usar NetworkMiner.

5. 8350582774e1d4dbe1d61d64c89e0ea1
6. El contenido de la receta secreta os lo dejo averiguar a ustedes.

9 de mayo de 2010

DNSpython - Sacando información de los DNS con Python

Como ya escribí en el post "Obtención de información de las DNS usando nslookup" desde un servidor DNS se puede obtener mucha información interesante.

El el post pasado para obtener la información usamos la herramienta nslookup. En este caso vamos a implemantar una herramienta que obtenga los datos más interesantes usando la librería DNSPython.

Los datos vamos a mostrar son: CNAME (Nombre canónico) , IPs y sus resoluciones inversas, MX (Registros de correo), NS (Registros de servidores DNS), SOA (marca el inicio de una zona de autoridad), TXT, LOC (localización), MINFO y HINFO (Información del correo y host respectivamente).

Cabe destacar que algunos de estos datos no se encuentran en todos los servidores de nombre.

Además para realizar las consultas vamos a usar en DNS de google situado en 8.8.8.8.

Bueno a continuación el código:

'''
@copyright: GPL v.3
@author: ehooo
@contact: <ehooo|at|rollanwar|dot|net>
'''
import dns.resolver
import dns.reversename
import getopt, sys

if __name__ == '__main__':
try:
opts, args = getopt.getopt(sys.argv[1:], "h:", ["host="])
except getopt.error, msg:
print msg
print sys.argv[0] + " [ -h | --host= ]"
exit(2)
host = None
for o, a in opts:
if o in ("-h", "--host"):
host = a
if host is None:
print sys.argv[0] + " [ -h
| --host= ]"
exit(1)

myresolver = dns.resolver.Resolver()
myresolver.domain = dns.name.Name("google-public-dns-a.google.com")
myresolver.nameserver = ['8.8.8.8']

print "DATOS DEL HOST:", host
try:
answers = myresolver.query(host, 'CNAME')
for rdata in answers:
print "CNAME:", str(rdata.target)
except dns.resolver.NoAnswer:
print "CNAME: No se puede obtener"

try:
answers = myresolver.query(host, 'A')
ip = []
for rdata in answers:
n = dns.reversename.from_address(rdata.address)
try:
answers_inv = myresolver.query(n, 'PTR')
for rdata_inv in answers_inv:
ip += [(rdata.address, str(rdata_inv.target))]
except dns.resolver.NoAnswer:
ip += [(rdata.address, "PTR: Sin respuesta "+str(n))]
except dns.resolver.NXDOMAIN:
ip += [(rdata.address, "PTR: Dominio NX "+str(n))]
print "IPs:", ip
except dns.resolver.NoAnswer:
print "IPs: No se puede obtener"

try:
answers = myresolver.query(host, 'MX')
mx = []
for rdata in answers:
mx += [str(rdata.exchange)]
print "MXs:", mx
except dns.resolver.NoAnswer:
print "MXs: No se puede obtener"

try:
answers = myresolver.query(host, 'NS')
ns = []
for rdata in answers:
ns += [str(rdata.target)]
print "NSs:", ns
except dns.resolver.NoAnswer:
print "NSs: No se puede obtener"

try:
answers = myresolver.query(host, 'SOA')
for rdata in answers:
print "SOA:", str(rdata.mname), str(rdata.rname)
except dns.resolver.NoAnswer:
print "SOA: No se puede obtener"

try:
answers = myresolver.query(host, 'TXT')
for rdata in answers:
print "TXT:", rdata.strings
except dns.resolver.NoAnswer:
print "TXT: No se pueden obtener"

try:
answers = myresolver.query(host, 'LOC')
for rdata in answers:
print "LOC:", "Latitud",rdata.float_latitude,"Logitud", rdata.float_longitude
except dns.resolver.NoAnswer:
print "LOC: No se pueden obtener"

try:
answers = myresolver.query(host, 'MINFO')
for rdata in answers:
print "MINFO:", rdata.to_text()
except dns.resolver.NoAnswer:
print "MINFO: No se pueden obtener"

try:
answers = myresolver.query(host, 'HINFO')
for rdata in answers:
print "HINFO:", rdata.to_text()
except dns.resolver.NoAnswer:
print "HINFO: No se pueden obtener"


El resultado sería el siguiente:

DATOS DEL HOST: www.rollanwar.net
CNAME: rollanwar.net.
IPs: [('66.98.184.55', 'hispla.com.')]
MXs: ['rollanwar.net.']
NSs: ['ns1.hispla.com.', 'ns2.hispla.com.']
SOA: ns1.hispla.com. sistema.hispla.com.
TXT: No se pueden obtener
LOC: No se pueden obtener
MINFO: No se pueden obtener
HINFO: No se pueden obtener

Más info:

http://www.iana.org/assignments/dns-parameters
http://www.dnspython.org/