Auditoría de sitios web en TOR con python

Buenas a todos, en el post de hoy daremos inicio a una cadena en la que veremos como automatizar con python tanto la auditoría web de una página alojada en la red TOR, como la auditoría de páginas "anonimizando" la comunicación, si se puede seguir llamando anónimo.... ;)

En el primer artículo de la cadena analizaremos como navegar desde python por TOR, utilizando como proxy el navegador Tor Browser:




La idea es muy sencilla, en primer lugar utilizaremos la librería socks para canalizar la comunicación de nuestro script por el puerto 9050, por el que tendremos escuchando Tor, levantado por el Tor Browser, y a continuación realizaremos una operación sencilla, como es la extracción de los enlaces alojados en una página web.

A continuación os dejamos con el código del script:
#! /usr/bin/env python
import urllib2, sys, re, urlparse, datetime, optparse, os, socks, socket

#Funcion proxy TOR
def create_connection(address, timeout=None, source_address=None):
    sock = socks.socksocket()
    sock.connect(address)
    return sock

#Funcion que recupera todos los enlaces de una pagina
def getLinks(page):
    links = []
    try:
        #Recuperamos el codigo de la pagina
        f = urllib2.urlopen(page)
        code = f.read()
        f.close()
        #Recuperamos los enlaces
        urls = re.finditer('href="(.*?)[\'"]', code)    
        for url in urls:
            links.append(url.group(0).replace("'", '').replace('"', "").replace('href=', ""))
        return links
    except HTTPError, e:
        print "Ocurrio un error"
        print e.code
    except URLError, e:
        print "Ocurrio un error"
        print e.reason

if __name__ == '__main__':
    parser = optparse.OptionParser('usage %prog -u <url>')
    parser.add_option('-u', dest='url', type='string', help='url')
    (options, args) = parser.parse_args()
    url = options.url
   
    #Lanzamos proxy TOR
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
    socket.socket = socks.socksocket
    socket.create_connection = create_connection   

    #Procesamos la pagina
    for link in getLinks(url):
        print link
Para ejecutarlo basta con llamar al programa "tor.py" pasándole con el parámetro -u la URL TOR que queremos auditar:


¿Sencillo no? En próximos posts de la cadena seguiremos viendo nuevas posibilidades que nos dan python y otros lenguajes para trabajar con proxys durante los procesos de auditoría.

Saludos!