jueves, febrero 26, 2009

Python decompile revisited

Ya escribí sobre esto. Aparte del servicio mencionado, se puede usar el módulo dis.
He visto que existe otro servicio para decompilar: DePython.
Y que el módulo antiguo también está en sourceforge: decompyle.

Sobre el script he leido:

"There used to be a module, decompyle, that decompiled .pyc files up to
version 2.2 of python. Decompyle for 2.3 is now a paid for web service and
the 2.2 decompyle seems to have been yanked."

Pero también:

"It will decompile Python up to version 2.3, but not 2.4+. "


¿Cual tendrá razón? Voy a probarlo yá!

viernes, febrero 06, 2009

Sniffing

Debido a la realización de un script, que estoy realizando para logarme a una web, me he visto obligado a usar un sniffer.
Desde mi navegador me conectaba sin problema, pero desde la maquina en la que estaba desarrollando no. Solución ver que mensajes HTTP se estaban enviando desde un sitio y desde otro.
Desde mi navagador (windows) usé wireshark, y desde la maquina linux (solo tengo acceso por consola) iba a usar tcpdump, con la intención de luego importar el fichero generado con wireshark.

Al final lo de tcpdump, no me hizo falta, ya que desde windows, vi que realmente la petición de login era un GET, en lugar de un POST (con datos ocultos) como estaba suponiendo.

Y hasta aqui la historia, el resto es comentar algún producto mas (que no he usado); siempre pensado en el analisis de HTTP.
  • httpfox: un addon para firefox para analizar el trafico http.
  • httpwatch: similar a httpfox Este también vale para IE. Tienen versión gratis, pero la completa es de pago.
  • webscarab: funciona como un proxy. Escrito en Java. Soport HTTP y HTTP. Ummm, no conocia el sitio donde está alojada OWASP. Habrá que echarle un ojo...
  • Para windows, hay una aplicación equivalente a tcpdump, windump. Usa winpcap que es el porting a windows de libpcap.
  • urlsnarf, de dsniff.
Ya sobre sniffing mas en general:

He visto que wireshark puede manerar estos tipos de ficheros: 5vw, acp, atc, bfr, cap, enc, erf, fdc, pcap, pkt, snoop, syc, tcp, tr1, trace, trc, wpc, wpz, rf5.

jueves, febrero 05, 2009

urllib2 a través de un proxy NTLM

Tenía pendiente desde hacía tiempo probar esto...
Pues bien, al menos hasta la versión que yo he usado (python 2.5) no es posible usar urllib2 con un proxy NTLM.

Ante esto tenemos dos opciones:
Lo deseable es que urllib2 al igual que tiene un ProxyBasicAuthHandler, tuviera uno para el protocolo NTLM.

Tanto para un caso como para el otro, tendremos que hacer que urllib2 no use el proxy por defecto. Un ejemplo:


proxy_support = urllib2.ProxyHandler({'http':'http://localhost:5555'})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)

[*] parece una chorrada esto que he dicho aquí, pero no lo es tanto. Normalmente en el trabajo los sysadmin no te darán la opción, pero... muchos de vosotros teneis maquinas de trabajo a las cuales si teneis acceso a través de SSH, y desde las cuales si teneis salida a internet. Pues bien... lo que se puede hacer es montar un tunel SSH y redirigir el trafico HTTP a través del tunel. Es decir... estais corriendo un proxy en local que redirige el tráfico a otra maquina.
Esto tiene la ventaja adicional de que el tráfico va encriptado.

miércoles, febrero 04, 2009

Cookies en python

Ando haciendo un servicio que hace uso de urllib2.
Sobre urllib2 recomendar este tutorial. Es realmente bueno; asi como los demas del mismo sitio.

Cuando abres una url, con urlopen, se hace uso de una serie de openers por defecto, entre los que no se encuentra el que maneja los cookies. Sobre este tema os recomiendo esta página.

Haciendo unas pruebecillas, sin usar HTTPCookieProcessor, obtenia las siguientes cabeceras en una respuesta:


Connection: close
Content-Length: 159
Via: 1.1 PUBLICO2
Date: Wed, 04 Feb 2009 15:42:11 GMT
Location: http://www.8a.nu/login/SessionTimeOut.aspx
Content-Type: text/html; charset=iso-8859-1
Server: Microsoft-IIS/6.0
Cache-Control: private
X-Powered-By: ASP.NET
X-Aspnet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=h5iruz45bl041xrvrhbn1tmk; path=/; HttpOnly


Como podeis ver, el cookie está al final. Pues bien, si incluimos el opener para el cookie, si imprimo de nuevo los headers, está información ha sido extraida. Y no sólo la del cookie, sino la 'Location'.


Connection: close
Content-Length: 1235
Via: 1.1 PUBLICO2
Date: Wed, 04 Feb 2009 15:42:11 GMT
Content-Type: text/html; charset=iso-8859-1
Server: Microsoft-IIS/6.0
Cache-Control: private
X-Powered-By: ASP.NET
X-Aspnet-Version: 2.0.50727


Estas trazas las he imprimido metiendo unas trazas en el método http_response de HTTPCookieProcessor:



def http_response(self, request, response):
self.cookiejar.extract_cookies(response, request)
return response


Lo mas estraño es que las trazas me salian un par de veces!!! La primera con la informacion sin eliminar, y la segunda con ella eliminada. No se el porqué.

Si queremos acceder a la información de los cookies, lo podemos hacer a traves de la instancia del cookie processor. Ejemplo:


cookieProcessor = urllib2.HTTPCookieProcessor()
urllib2.install_opener(urllib2.build_opener(cookieProcessor))
...
print cookieProcessor.cookiejar._cookies


_cookies es un diccionario, indexado por dominio. El valor es otro diccionario indexado por rutas.
Os muestro un ejemplo:


{'www.8a.nu': {'/': {'ASP.NET_SessionId': Cookie(version=0, name='ASP.NET_SessionId', value='1agr3qatdwhvin3en2d4ye45', port=None, port_specified=False, domain='www.8a.nu', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)}}}


La 'Location' que desaparece de los headers, se puede obtener con el método geturl de la respuesta. Ah! y los header con el método info.

Postada
Un tutorial que también recomiendo leer es el de Autentificación: Basic Authentication.