miércoles, 8 de marzo de 2017

Mini-Curso Hacking Web con Python | #1 Brute-Force de directorios

Requisitos:

Para seguir este curso es importante tener una base de conocimientos en python.

Introducción:

Cuando estas realizando un pentest, es importante saber donde están los paneles administrativos, donde puedes encontrar información sensible, páginas secretas...
Uno de los métodos es estar probar url por url para saber cual existe y cual no, por ejemplo:
site.com/admin
site.com/administracion
A esto se le conoce como "Brute-Force de directorios"

En este capítulo aprenderás a usar python para hacer un brute-force de directorios.

Tutorial:

Creamos un nuevo archivo .py el cual contendrá el siguiente script:

import requests 1
url = 'http://site.com'  2
respuesta = requests.get(url) 3
print respuesta.text 4

1 Importamos la librería request.
2 Establecemos en una variable la URL que queremos atacar.
3 Guardamos la respuesta en una variable
4 Imprimimos por pantalla la respuesta

De este modo nos aparecerá por pantalla la página completa. Pero a nosotros no nos interesa eso, nos interesa saber si esa página existe o no, ¿y cómo hacemos eso?, muy fácil simplemente haremos lo siguiente:

import requests 
url = 'http://site.com'  
respuesta = requests.get(url)
print respuesta.text -- Cambiamos por --> print respuesta.status_code

Si ejecutamos el script nos saldrá por pantalla el código 200, el cual nos indica que la página web solicitada existe.

¿Hasta aquí fácil, no?, vamos a verlo más claro:

Si nosotros en el script ponemos una URL que no existe como se ve a continuación:

import requests  
url = 'http://site.com/aaaaaaaaaaaaaaa'  
respuesta = requests.get(url)
print respuesta.status_code

Nos devolverá el código 404 que nos indica que no existe dicha página.

En base a ese código podemos saber si la url existe o no, esto resulta de gran utilidad, por ejemplo si queremos saber si el panel administrativo es /admin, pondremos:
  
import requests  
url = 'http://site.com/admin'  
respuesta = requests.get(url)
print respuesta.status_code

Si nos devuelve el 403 os indica que no tenemos los permisos suficientes para acceder a ese recurso.
¿Como podemos automatizar todo este proceso?, podemos crear un archivo de texto con una lista de varios directorios, y que recorra el archivo probando los directorios. Muy bien, vamos a implementarlo en nuestro script:

import requests  
url = 'http://site.com/'
directorio = 'admin' 1
respuesta = requests.get(url+directorio) 2
print respuesta.status_code

1 Creamos una nueva variable, la cual contendrá un string que será el nombre del directorio que queremos comprobar.
2 Juntamos la url que queremos comprobar + el directorio.

En vez de poner el nombre del directorio nosotros vamos a crear un wordlist (Un archivo de texto que contiene una lista de nombres), la distribución Kali Linux trae por defecto bastantes diccionarios que podemos encontrar en la ruta: /usr/share/dirbuster/wordlists, en este capitulo usaremos uno de ellos.

Para cargar un wordlist en nuestro script haremos lo siguiente:

import requests
archivo = open('/usr/share/dirbuster/wordlists/directory-list-2.3-small.txt') 1
lineas = archivo.readlines() 2
url = 'http://site.com/'
directorio = 'admin'
respuesta = requests.get(url+directorio)
print respuesta.status_code 

1 Abriremos el archivo wordlist
2 Como solo queremos las lineas de ese archivo para ello usamos la variable archivo. y el método readlines y la salida la almacenamos en una variable llamada lineas.
En esa variable ahora se encuentran todas las lineas de nuestro archivo, podemos iterar en esas lineas con un for.  

import requests
archivo = open('/usr/share/dirbuster/wordlists/directory-list-2.3-small.txt'
lineas = archivo.readlines() 
url = 'http://site.com/' 
for linea in lineas: 1
    directorio = linea 2
    respuesta = requests.get(url+directorio)
print respuesta.status_code


1 Sacará linea por linea de todas las lineas del archivo.
2 Pondra el nombre de directorio como si fuese una linea

Podemos simplificar todo esto quitando la variable directorio y metiendo la variable linea en respuesta, de este modo:

import requests
archivo = open('/usr/share/dirbuster/wordlists/directory-list-2.3-small.txt'
lineas = archivo.readlines() 
url = 'http://site.com/' 
for linea in lineas:
    respuesta = requests.get(url+linea)
print respuesta.status_code

Cambiarmos el print por url+linea para saber que url existe y cual no.

import requests
archivo = open('/usr/share/dirbuster/wordlists/directory-list-2.3-small.txt'
lineas = archivo.readlines() 
url = 'http://site.com/' 
for linea in lineas:
    respuesta = requests.get(url+linea)
print url+linea, respuesta.status_code


Como apareceran muchos directorios que no existen vamos a filtrar para que solo aparezcan los que si existen, lo haremos añadiendo lo siguiente:

import requests
archivo = open('/usr/share/dirbuster/wordlists/directory-list-2.3-small.txt'
lineas = archivo.readlines() 
url = 'http://site.com/' 
for linea in lineas:
    respuesta = requests.get(url+linea)
    codigo = respuesta.status_code  1  
if codigo != 404 and codigo != 403: 2
    print url+linea, codigo 3


1 Creamos una variable llamada codigo que va a tener el status_code
2, 3 Añadimos una condicion, si el codigo es distinto a 404 o a 403 que aparezca en pantalla.

Script completo:

import requests
archivo = open('/usr/share/dirbuster/wordlists/directory-list-2.3-small.txt'
lineas = archivo.readlines() 
url = 'http://site.com/' 
for linea in lineas:
    respuesta = requests.get(url+linea)
    codigo = respuesta.status_code  
if codigo != 404 and codigo != 403:
    print url+linea, codigo 

Si tienes alguna duda, ponla en comentarios y estate atento al segundo episodio. Espero que te haya sido de utilidad este capítulo.
 



 
Previous Post
Next Post

post written by:

0 comentarios: