Blog

Hacking con Python – Parte I

Vamos a iniciar una serie de posts en los que vamos a profundizar sobre el hacking con Python. Una de las razones por las cuales Python es muy utilizado para el hacking es por la cantidad de librerías existentes y por la facilidad de integrarlas en nuestro programas.

El objetivo final es saber crear nuestras propias herramientas de hacking para usarlas y modificarlas a nuestro antojo y, así evitar las búsquedas innecesarias en Google.

Python suele venir instalado en la mayoría de las distribuciones de Linux. No obstante, en caso de no estar instalado es tan sencillo como teclear:

sudo apt-get install python

En cualquier caso, es recomendable instalar una serie de herramientas que iremos usando a lo largo de los posts. Para instalar herramientas de Python hay dos formas. La más sencilla es mediante “easy_install”. Para instalar “easy_install” tenemos que bajarnos el setuptools de Python mediante:

wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg

Una vez descargado, ejecutamos el script mediante:

sh setuptools-0.6c11-py2.7.egg

Ahora procedamos a instalar las herramientas:

easy_install pyPdf python-nmap pygeoip mechanize BeautifulSoup4

Ya tenemos nuestro entorno de desarrollo configurado, por lo que vamos a empezar con el programa. En este primer post vamos a desarrollar una aplicación muy sencilla que nos permita crackear passwords a partir de diccionarios.

Para ello vamos a usar la librería crypt de Python. La primera prueba más sencilla que podemos realizar es:

python1Lo que hemos hecho ha sido ejecutar el entorno de Python mediante el comando “python”. Después hemos ejecutado las siguientes líneas de código:

import crypt
crypt.crypt("HighSec","HX")

Con esto indicamos que queremos cifrar la clave “HighSec” con Salt “HX”. Una vez realizada esta pequeña prueba, vamos  a crearnos nuestro programa. Para ello nos creamos una función que compruebe la clave a descifrar con nuestro diccionario previamente creado:

def testPass(cryptPass):
 salt = cryptPass[0:2]
 dictFile = open('diccionario.txt','r')

 for word in dictFile.readlines():
   word = word.strip('\n')
   cryptWord = crypt.crypt(word,salt)
   if (cryptWord == cryptPass):
      print "[+] Found Password: "+word+"\n"
      return
   print "[-] Password Not Found.\n"
return

Como vemos, esta función recibe una contraseña cifrada, recorre nuestro diccionario mientras va cifrando cada entrada de él y se comprueba sin ambas contraseñas son iguales.

Ahora veamos cómo sería el main:

def main():
  passFile = open('passwords.txt')
  for line in passFile.readlines():
    if ":" in line:
    user = line.split(':')[0]
    cryptPass = line.split(':')[1].strip(' ')
    print "[*] Cracking Password For: "+user
    testPass(cryptPass)
if __name__ == "__main__":
main()

Observamos que lo único que hace es abrir un fichero donde están las passwords con los usuarios (al estilo del fichero de password de Linux) y llama a la función test implementada anteriormente.

Con esto ya tendríamos nuestro programa de descifrado de passwords finalizado. Como podemos ver, la dificultad real radica en construir un buen diccionario en donde comprobar nuestras contraseñas a descifrar.

Ahora bien, el fichero /etc/passwd de Linux usa el cifrado SHA-512. ¿Cómo podríamos modificar nuestro programa para ser capaces de descifrar dichas contraseñas?

En el próximo post veremos si es posible realizar esto y, en caso afirmativo, cómo se hace.

Fuente: Violent Python, TJ. O’Connor

 

Autor:  Borja Simancas (@borjasr92)

  1. Jorge
    Jorge03-13-2014

    Hola Borja!
    Muchas gracias por enseñar esto, creo que me va servir mucho ahora que estoy aprendido sobre seguridad y que quiero aprender python.
    Ademas de la librería “crypt” hay alguna otra que sea más sencilla? Me he fijado también, que hay un sitio en el que están haciendo vídeos sobre hacking con python (http://thehackerway.com/2014/02/04/hacking-con-python-parte-1-banner-grabbing/), pero no he tenido tiempo de verlos, están relacionados con estos artículos? me recomiendas que los vea, considerando que de python se más bien poco?
    Muchas gracias y enhorabuena!

    • Borja
      Borja03-17-2014

      Hola! Los vídeos de hacking que me pasas no los he visto, sinceramente. Pero no están relacionados con estos artículos.
      Para iniciarte en el mundo de python te recomiendo que hagas alguna especie de tutorial de inicio de Python. En su propia página tienen una guía para principiantes: https://wiki.python.org/moin/BeginnersGuide/Examples .
      Por último, respecto a la librería crypt, personalmente no me parece una de las librerías más complejas. De todas formas, te dejo los módulos disponibles de python:
      http://docs.python.org/2/py-modindex.html por si necesitas echarle un ojo a la documentación.
      Gracias!

  2. javiarch
    javiarch03-14-2014

    Hace unos meses vengo siguiendo el blog. Felicitaciones por el post de Hacking con Python!!! Quedo a la espera de mas…..
    🙂

    • Borja
      Borja03-17-2014

      Muchas gracias! Espero que los siguientes os gusten también!

  3. chapo
    chapo03-31-2014

    Buenas, esta muy bien ese libro hace un tiempo lo lei solo una observacion probando elcodigo hace tiempo me daba al momento de checar las lineas que pasa si dos passwords son iguales con diferente usuario, el codigo tal cual no nos andara por que la funcion readlines() dara un salto lo mas conveniente seria agregar un strip debajo del for, les dejo el mismo codigo con la adaptacion del script, y como ejemplo hagan varias lineas prueben que no andara y al momento de hacer el strip de \n como encontrara con todos los usuarios si es que es el mismo pass
    en su file pongan dos lineas para que vean el detalle de las lineas.
    root:HX9LLTdc/jiDE
    root:HX9LLTdc/jiDE
    xuser:HX9LLTdc/jiDE

    Ya si son varios users solo agreguen el strip que les dijo al codigo que les dejo el mismo pero añadiendo el strip

    def main():
    passFile = open(‘passwords.txt’)
    for line in passFile.readlines():
    line = line.strip(‘\n’) # LA UNICA LINEA QUE DEBE DE MODIFICARSE EN EL CASO DEL EJEMPLO EXPLICADO
    if “:” in line:
    user = line.split(‘:’)[0]
    cryptPass = line.split(‘:’)[1].strip(‘ ‘)
    print “[*] Cracking Password For: “+user
    testPass(cryptPass)
    if __name__ == “__main__”:
    main()

Leave a Reply

*

    No Twitter Messages