Hacking Tools: Obteniendo datos de un objetivo web con Python

Continuando con el post anterior, que es una introducción a la creación de herramientas en Python, veremos ahora cómo obtener datos interesantes (desde el punto de vista de seguridad informática) de un objetivo web.
En este artículo vamos a realizar pruebas con un sitio que tenga instalado Moodle, obtendremos los banners del servidor y luego vamos a comparar un archivo (/admin/environment.xml) que viene en la raíz de Moodle con un hash MD5, con esto buscaremos identificar la versión de Moodle. Por seguridad puede que existan webmasters que eliminen dicho archivo, pero recuerda que esto es un ejemplo, luego podrás incorporar todas las comparaciones que quieras para obtener de mejor manera la versión.
Importamos la librería "urllib". Con ella podremos generar peticiones HTTP y obtener las cabeceras de la respuesta. Utilizaremos el código del post anterior y lo iremos completando
#! /usr/bin/python
 
import optparse
import urllib.request
 
print ("""
Mi primera herramienta 1.0
modo de uso: scan.py -u URL
""")
 
#comentario: las líneas dentro de las tres comillas se interpretan
#incluyendo los saltos de línea
 
 
parser = optparse.OptionParser()
 
parser.add_option('-u', '--url', dest="url", help="Direccion del sitio web a escanear")
 
options = parser.parse_args()
Luego de incorporar la librería, realizaremos la llamada a la URL y con la conexión establecida en una variable podremos obtener su información
#! /usr/bin/python
 
import optparse
import urllib.request
 
print ("""
Mi primera herramienta 1.0
modo de uso: scan.py -u URL
""")
 
#comentario: las líneas dentro de las tres comillas se interpretan
#incluyendo los saltos de línea
 
 
parser = optparse.OptionParser()
 
parser.add_option('-u', '--url', dest="url", help="Direccion del sitio web a escanear")

(options, args) = parser.parse_args()

url = options.url

print ("Obteniendo datos del servidor")

cnn = urllib.request.urlopen(url)

print ("server  : " + cnn.info().get('server'))
print ("x-powered-by : " + cnn.info().get('x-powered-by')) 
print ("x-frame-options : " + cnn.info().get('x-frame-options'))


Realizo una prueba con un Moodle local de la siguiente forma
./scan.py -u http://localhost/moodle
Y la salida es la siguiente
Mi primera herramienta 1.0
modo de uso: scan.py -u URL

Obteniendo datos del servidor
server          : Apache/2.2.15 (CentOS)
x-powered-by    : PHP/5.3.3
x-frame-options : sameorigin

Con sólo algunas líneas de código ya tenemos el banner del servidor web y versión de PHP. Ahora vamos a buscar el archivo environment.xml de nuestro Moodle y obtendremos su hash MD5, con ese dato podremos comparar con el archivo environment.xml de nuestro objetivo y saber qué versión de Moodle tiene instalada.
Importamos la librería hashlib y crearemos un arreglo o matríz con las versiones que conocemos de Moodle y su Hash MD5
#! /usr/bin/python

import hashlib 
import optparse
import urllib.request

 
print ("""
Mi primera herramienta 1.0
modo de uso: scan.py -u URL
""")
 
#comentario: las líneas dentro de las tres comillas se interpretan
#incluyendo los saltos de línea
 
 
parser = optparse.OptionParser()
 
parser.add_option('-u', '--url', dest="url", help="Direccion del sitio web a escanear")
 
(options, args) = parser.parse_args()

url = options.url

print ("Obteniendo datos del servidor")

cnn = urllib.request.urlopen(url)

print ("server  : " + cnn.info().get('server'))
print ("x-powered-by : " + cnn.info().get('x-powered-by')) 
print ("x-frame-options : " + cnn.info().get('x-frame-options'))

versiones = [
 ['54145C49BF5F6A90ACE4CF7613580587', '2.9'],
 ['B8C9BB0F1F212E66A561E17EFD7BC142', '3.2.1']
]
Nos queda descargar el archivo del servidor, calcular su hash MD5 y compararlo con nuestro arreglo 'versiones'. Para descargar el archivo volveremos a usar la librería urllib.
#! /usr/bin/python

import hashlib 
import optparse
import urllib.request

 
print ("""
Mi primera herramienta 1.0
modo de uso: scan.py -u URL
""")
 
#comentario: las líneas dentro de las tres comillas se interpretan
#incluyendo los saltos de línea
 
 
parser = optparse.OptionParser()
 
parser.add_option('-u', '--url', dest="url", help="Direccion del sitio web a escanear")
 
(options, args) = parser.parse_args()

url = options.url

print ("Obteniendo datos del servidor")

cnn = urllib.request.urlopen(url)

print ("server  : " + cnn.info().get('server'))
print ("x-powered-by : " + cnn.info().get('x-powered-by')) 
print ("x-frame-options : " + cnn.info().get('x-frame-options'))

versiones = [
 ['54145C49BF5F6A90ACE4CF7613580587', '2.9'],
 ['B8C9BB0F1F212E66A561E17EFD7BC142', '3.2.1']
]

cnn = urllib.request.urlopen(url + '/admin/environment.xml')
contenido = cnn.read()
hashremoto = hashlib.md5(contenido).hexdigest()

for i in versiones:
 if i[0].lower() == hashremoto.lower():
  print("\nMoodle version " + i[1])
Con estos datos podremos revisar vulnerabilidades para la versión objetivo y luego explotarlas. La búsqueda de vulnerabilidades la dejamos para el siguiente post.
Saludos

Comentarios

Entradas populares de este blog

Ocultando la web shell como una imagen (Apache + PHP)

Desempaquetando Themida 2 (unpacking windows binary) - Análisis de Malware

Evasión de antivirus modernos usando Process Injection - MITRE T1055