Hacking con Python - Interactuando con servidores web

Iniciado por BrowserNet, Diciembre 04, 2016, 01:43:50 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.



Saludos mis queridos fieles lectores bueno en esta oportunidad deseo aclarar lo siguiente hace mas de 1 año estuve aprendiendo Python pero lamentablemente deje de estudiar ese lenguaje por motivos personales, hace 2 semanas llevo aprendiendo nuevamente las bases y todo lo demás.

Cabe de decir que en todos mis aprendizajes que emplee en mi conocimiento, serán expuestos en el blog para compartir con ustedes mi mejoramiento.

Si deseas aprender python y dar tus primeros pasos en este lenguaje sencillo pero a la vez muy potente, dejare un post que realice hace mucho tiempo.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

¿Qué es Python?

Python es un lenguaje de alto nivel  orientado a objetos, La sintaxis de python   es muy limpia, su código es muy legible y es muy fácil de entenderlo.
Antes de comenzar por favor trata de leer el anterior POST.

Este escenario lo haremos desde el sistema operativo Kali linux - Debian, que por defecto lo tiene instalado, si utilizas un sistema Linux desde 0 puedes utilizar APT para instalarlo desde la terminal.

Código: php
root@kali:~# apt-get install python


Algo que debo mencionar, es que trabajemos con la versión 2.7.X.
Descarga:
Windows: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Mac  OS:  No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Después de tener instalado Python puedes ejecutarlo por la misma terminal:



Cambien puedes utilizar un IDE yo recomiendo Ninja-IDE, lo pueden descargar de su pagina oficial:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

En mi caso tengo que descargar la versión debian en formado .deb, para poder instalarlo.

Código: php
root@kali:~/Downloads# dpkg -i ninja-ide_2.3+r597~saucy1_all.deb 




También puedes instalar Sublime-Text para este escenario, para escribir código y activar su opción Build para poder ejecutar lo que estas programando, pero por mi parte no lo recomiendo, es mejor ejecutarlo por Ninja-IDE O por la terminal el archivo:  python No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Vamos a utilizar algunas librerías dedicadas al manejo de plataformas web, empecemos.

Mechanize:

Es una librería que nos permite interactuar con cualquier plataforma web, como si estuviéramos en un navegador gráfico, ya que manipularemos los envíos de las peticiones en cualquier tipo de instancia.

Mechanize tiene 2 componentes principales:

Browser   -  Nos permite interactuar de manera completa a cualquier servidor web.

Controles - Nos permiten interactuar con  la informacion  de un servicio en su mayoría de codificación html. 



En esta prueba de concepto vamos a elaborar las peticiones desde mi servidor que esta alojado en una maquina virtual corriendo en XAMPP, ustedes pueden observar que la plataforma es "DVWA".

Bien lo que primero haremos, sera añadir la librería en nuestro proyecto de la siguiente manera:

import mechanize
si no  tienes esta librería no te preocupes, puedes instalarla de esta manera desde tu terminal:

pip install mechanize

luego crearemos nuestros objetos para definir nuestras instancias, y empezar a enviar nuestra peticiones.



>>> import mechanize

Importamos nuestra librería mechanize. 

>>> brow = mechanize.Browser()

creamos una instancia del objeto Browser de mechanize, para poder hacer peticiones a los servidores http.

>>> respuesta = No tienes permitido ver los links. Registrarse o Entrar a mi cuenta('No tienes permitido ver los links. Registrarse o Entrar a mi cuenta')

luego de ello utilizamos la instancia open para poder interactuar con nuestro primer objeto llamado brow y establecer una petición con url No tienes permitido ver los links. Registrarse o Entrar a mi cuenta'

>>> print respuesta.geturl()

Entonces nosotros queremos recibir la respuesta del servidor, por ello le daremos print en el objeto respuesta y añadiremos geturl que nos permitirá obtener la url del servidor. 

>>> print No tienes permitido ver los links. Registrarse o Entrar a mi cuenta()

Nos permitirá poder recibir la respuesta de informacion del servidor.

Date: Mon, 21 Nov 2016 04:29:00 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2h PHP/5.5.38
X-Powered-By: PHP/5.5.38
Set-Cookie: PHPSESSID=0h5f5rqpo4a06hduh8e067lg16; path=/
Expires: Tue, 23 Jun 2009 12:00:00 GMT
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: PHPSESSID=0h5f5rqpo4a06hduh8e067lg16; path=/; httponly
Set-Cookie: security=impossible; httponly
Content-Length: 1567
Connection: close
Content-Type: text/html;charset=utf-8
Content-Type: text/html; charset=UTF-8


Si nosotros podemos ver este tipo de informacion de la versiones del servicios que  tiene, podemos ver que nos arroja como resultado:


Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2h PHP/5.5.38

Fácilmente podemos buscar "Exploits", para poder elaborar un ataque remoto si lo vemos de esa perspectiva.

Bien continuemos con esto, si nosotros deseamos enviar peticiones a formularios, en este ejemplo buscaremos "vulnerabilidades SQLi metodo POST", para ello tengo el siguiente escenario.



Nuevamente añadiré mi instancia y todo los procesos para poder establecer una respuesta del servidor. 

>>> import mechanize
>>> br = mechanize.Browser()
>>> respuesta = No tienes permitido ver los links. Registrarse o Entrar a mi cuenta('No tienes permitido ver los links. Registrarse o Entrar a mi cuenta')


Luego vamos a establecer una búsqueda de todos los formularios que contenga el modulo del login.

>>> for form in br.forms():
...     print form
...


Vemos que nos arroja los siguientes formularios, en la linea 1 llamada login:

<login POST No tienes permitido ver los links. Registrarse o Entrar a mi cuenta application/x-www-form-urlencoded
  <TextControl(login_user=)>
  <PasswordControl(login_password=)>
  <SubmitControl(mysubmit=Login) (readonly)>>


comprobaremos si son los mismos formularios, desde el navegador web.


podemos observar que los formularios son los mismos, entonces no hay ningún problema.

Aclaremos los siguientes puntos, mechanize tiene la opción de poder manipular nuestros atributos y establecer los envíos de datos por su modulo submit.

Continuando con siguiente, debemos establecer que linea de formularios trabaremos, como solo existe el valor uno, de manera lógica se establece como 0, si existieran 2 y nuestro formulario estuviera de bajo del primero seria 1

>>> No tienes permitido ver los links. Registrarse o Entrar a mi cuenta_form(nr=0)

luego de añadir el numero del formulario que trabajaremos.
Vamos añadir los atributos a los respectivos formularios, en esta prueba hemos utilizado un conocido Bypass = ' or 1=1--

>>> br.form['login_user'] = "' or 1=1--"
>>> br.form['login_password'] = "' or 1=1--"

Entonces enviaremos nuestra petición al servidor de la siguiente manera.

>>> br.submit()

<response_seek_wrapper at 0xb73fd12cL whose wrapped object = <closeable_response at 0xb74030ecL whose fp = <socket._fileobject object at 0xb746ed6c>>>

Vemos que nos ha enviado una respuesta, ahora lo que debemos hacer por ultimo es leer la fuente de la pagina ver, para ver que respuesta nos ha arrojado.

>>> print br.response().read()


<html>
<head>
</head>
<body bgcolor="#000000">
<font size="3" color="#FFFF00">
<div align="right">
<a style="font-size:.8em;color:#FFFF00" href='index.php'><img src="../images/Home.png" height='45'; width='45'></br>HOME</a>
</div>

<font size="5" color= "#FFFF00">You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''' at line 1</font><tr><td colspan="2" style="text-align:center;"><br/><p style="color:#FF0000;">
<center>
<img src="../images/slap1.jpg">
</center>
</p></td></tr>

Testing



Sencillo verdad, pero solo estamos estableciendo valores definidos por nosotros mismos, para poder entender Python desde esa perspectiva, para después crear nuestra propios herramientas y establezcan las funciones por si mismas.

Un consejo, si eres el master de una web trata de controlar y ver los registros de las conexiones entrantes.



Si en vez de establecer una petición para auditoria, deseamos entrar a un panel administrativo por medio de sus credenciales.

pues entraremos nuevamente en la plataforma DVWA



Pero como estaremos en un panel administrativo debemos definir nuestra Cookie, para poder establecer conexión persistente desde la terminal, para ello utilizaremos el modulo: cookielib



>>> import mechanize
>>> import cookielib
>>> br = mechanize.Browser()


La libreria Cookielib sirve para poder establecer una Cookie, para establecer conexión de usuario sin perderla al momento de actualizar o retroceder.

Luego de ello, hemos instanciado nuestro objetivo Cookiejar, para establecer su función con nuestro modulo mechanize. 

>>> cj = cookielib.LWPCookieJar()
>>> br.set_cookiejar(cj)


Aquí estamos diciendo que no utilizaremos buscada de robots.

>>> br.set_handle_robots(False)

Luego de ello, los que le comentaba si nosotros actualizamos la plataforma por la terminar o regresamos, se nos cerrara la sesión ya que no establecimos el proceso de disponibilidad.

>>> br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

se acuerdan que hace momentos mostré los registros de conexiones por XAMPP, en esta instancia nos permite poder modificar nuestros agentes de usuario, quiere decir que podemos hacernos pasar por una sistema MAC OS y simular que estamos navegando desde el navegador Opera.

>>> br.addheaders = [('User-agent', 'Opera/9.25 (Macintosh; PPC Mac OS X; U; en)')]


Entonces estableceremos la URL,que deseamos enviar peticiones.

>>> r = No tienes permitido ver los links. Registrarse o Entrar a mi cuenta('No tienes permitido ver los links. Registrarse o Entrar a mi cuenta')

ahora haremos nuevamente una búsqueda de formularios.


>>> for form in br.forms():
...    print form
...


<POST No tienes permitido ver los links. Registrarse o Entrar a mi cuenta application/x-www-form-urlencoded
  <TextControl(username=)>
  <PasswordControl(password=)>
  <SubmitControl(Login=Login) (readonly)>
  <HiddenControl(user_token=e8db4eb8dbfcad683b1ab919c61cb253) (readonly)>>

Si tu defines los atributos, sin especificar con que formulario desees trabajar, te saldrá error, por el simple hecho de no asignar el objeto.

>>> br.form['username'] = 'admin'

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object does not support item assignment

Entonces procederemos a elaborar dicha función correctamente asignando el valor 0, ya que en programación el valor inicial 1 es igual a 0

>>> No tienes permitido ver los links. Registrarse o Entrar a mi cuenta_form(nr=0)

Añadiremos nuestros atributos ( las credenciales reales )

>>> br.form['username'] = 'admin'
>>> br.form['password'] = 'password'


Enviaremos nuestro petición.

>>> br.submit()

<response_seek_wrapper at 0xb73d9a6cL whose wrapped object = <closeable_response at 0xb73f004cL whose fp = <socket._fileobject object at 0xb73ce9ac>>>

leeremos la respuesta del servidor por medio del código fuente.

>>> print br.response().read()



Comprobaremos si es el mismo código por medio del navegador gráfico.



Correcto, siempre cuando hagan consultas desde mechanize deben tener en claro que están interactuando como si fuese desde un navegador gráfico, pero desde la terminal.

ahora miremos los logs o registros del servidor apache para ver si nuestro agente de usuario que es Mozilla/Firefox  - Linux 32bits a cambiado a Opera - Mac OS



Espero les halla encantado este humilde articulo, me despido estaré estudiando mas métodos para poder continuar con este pequeño curso de Python.

Saludos!!!!