Capa de aplicación
Las aplicaciones web y los servidores web son fundamentales para nuestra presencia en línea y los ataques observados contra ellos constituyen más del 70% del total de ataques intentados en Internet. Estos ataques intentan convertir sitios web confiables en maliciosos. Por esta razón, las pruebas de la pluma del servidor web y de la aplicación web juegan un papel importante.
Pie de imprenta de un servidor web
¿Por qué debemos considerar la seguridad de los servidores web? Se debe a que con el rápido crecimiento de la industria del comercio electrónico, el principal objetivo de los atacantes es el servidor web. Para el pentesting del servidor web, debemos conocer el servidor web, su software de alojamiento y sistemas operativos junto con las aplicaciones que se ejecutan en ellos. La recopilación de dicha información sobre el servidor web se denomina huella del servidor web.
En nuestra sección siguiente, discutiremos los diferentes métodos para crear huellas de un servidor web.
Métodos para la huella de un servidor web
Los servidores web son software o hardware de servidor dedicado a manejar solicitudes y atender respuestas. Esta es un área clave en la que un pentester debe concentrarse mientras realiza pruebas de penetración de servidores web.
Analicemos ahora algunos métodos, implementados en Python, que se pueden ejecutar para la huella de un servidor web:
Prueba de disponibilidad de métodos HTTP
Una muy buena práctica para un probador de penetración es comenzar enumerando los diversos métodos HTTP disponibles. A continuación se muestra un script de Python con la ayuda del cual podemos conectarnos al servidor web de destino y enumerar los métodos HTTP disponibles:
Para empezar, necesitamos importar la biblioteca de solicitudes:
import requests
Después de importar la biblioteca de solicitudes, cree una matriz de métodos HTTP, que vamos a enviar. Usaremos algunos métodos estándar como 'GET', 'POST', 'PUT', 'DELETE', 'OPTIONS' y un método no estándar 'TEST' para comprobar cómo un servidor web puede manejar la entrada inesperada.
method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']
La siguiente línea de código es el bucle principal del script, que enviará los paquetes HTTP al servidor web e imprimirá el método y el código de estado.
for method in method_list:
req = requests.request(method, 'Enter the URL’)
print (method, req.status_code, req.reason)
La siguiente línea probará la posibilidad de seguimiento entre sitios (XST) enviando el método TRACE.
if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text:
print ('Cross Site Tracing(XST) is possible')
Después de ejecutar el script anterior para un servidor web en particular, obtendremos 200 respuestas OK para un método particular aceptado por el servidor web. Obtendremos una respuesta 403 Forbidden si el servidor web niega explícitamente el método. Una vez que enviemos el método TRACE para probar el rastreo entre sitios (XST), obtendremos405 Not Allowed respuestas del servidor web; de lo contrario, obtendremos el mensaje ‘Cross Site Tracing(XST) is possible’.
Pie de imprenta comprobando los encabezados HTTP
Los encabezados HTTP se encuentran tanto en las solicitudes como en las respuestas del servidor web. También contienen información muy importante sobre los servidores. Es por eso que el probador de penetración siempre está interesado en analizar información a través de encabezados HTTP. A continuación se muestra un script de Python para obtener la información sobre los encabezados del servidor web:
Para empezar, importemos la biblioteca de solicitudes:
import requests
Necesitamos enviar una solicitud GET al servidor web. La siguiente línea de código realiza una solicitud GET simple a través de la biblioteca de solicitudes.
request = requests.get('enter the URL')
A continuación, generaremos una lista de encabezados sobre los que necesita la información.
header_list = [
'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]
El siguiente es un bloque try and except.
for header in header_list:
try:
result = request.header_list[header]
print ('%s: %s' % (header, result))
except Exception as err:
print ('%s: No Details Found' % header)
Después de ejecutar el script anterior para un servidor web en particular, obtendremos la información sobre los encabezados proporcionados en la lista de encabezados. Si no hay información para un encabezado en particular, aparecerá el mensaje 'No se encontraron detalles'. También puede obtener más información sobre los campos HTTP_header en el enlace:.
Prueba de configuraciones de servidor web inseguras
Podemos usar la información del encabezado HTTP para probar configuraciones de servidor web inseguras. En la siguiente secuencia de comandos de Python, usaremos try / except block para probar encabezados de servidor web inseguros para la cantidad de URL que se guardan en un nombre de archivo de textowebsites.txt -
import requests
urls = open("websites.txt", "r")
for url in urls:
url = url.strip()
req = requests.get(url)
print (url, 'report:')
try:
protection_xss = req.headers['X-XSS-Protection']
if protection_xss != '1; mode = block':
print ('X-XSS-Protection not set properly, it may be possible:', protection_xss)
except:
print ('X-XSS-Protection not set, it may be possible')
try:
options_content_type = req.headers['X-Content-Type-Options']
if options_content_type != 'nosniff':
print ('X-Content-Type-Options not set properly:', options_content_type)
except:
print ('X-Content-Type-Options not set')
try:
transport_security = req.headers['Strict-Transport-Security']
except:
print ('HSTS header not set properly, Man in the middle attacks is possible')
try:
content_security = req.headers['Content-Security-Policy']
print ('Content-Security-Policy set:', content_security)
except:
print ('Content-Security-Policy missing')
Huella de una aplicación web
En nuestra sección anterior, discutimos la huella de un servidor web. De manera similar, la huella de una aplicación web también se considera importante desde el punto de vista de un probador de penetración.
En nuestra siguiente sección, aprenderemos sobre los diferentes métodos para crear huellas de una aplicación web.
Métodos de implantación de una aplicación web
La aplicación web es un programa cliente-servidor, que el cliente ejecuta en un servidor web. Esta es otra área clave en la que un pentester debe enfocarse mientras realiza pruebas de penetración de la aplicación web.
Analicemos ahora los diferentes métodos, implementados en Python, que se pueden usar para la huella de una aplicación web:
Recopilación de información mediante el analizador BeautifulSoup
Supongamos que queremos recopilar todos los hipervínculos de una página web; podemos hacer uso de un analizador llamado BeautifulSoup. El analizador es una biblioteca de Python para extraer datos de archivos HTML y XML. Se puede utilizar conurlib porque necesita una entrada (documento o url) para crear un objeto de sopa y no puede recuperar la página web por sí mismo.
Para empezar, importemos los paquetes necesarios. Importaremos urlib yBeautifulSoup. Recuerde que antes de importar BeautifulSoup, necesitamos instalarlo.
import urllib
from bs4 import BeautifulSoup
La secuencia de comandos de Python que se proporciona a continuación recopilará el título de la página web y los hipervínculos:
Ahora, necesitamos una variable que pueda almacenar la URL del sitio web. Aquí, usaremos una variable llamada 'url'. También usaremos elpage.read() función que puede almacenar la página web y asignar la página web a la variable html_page.
url = raw_input("Enter the URL ")
page = urllib.urlopen(url)
html_page = page.read()
los html_page se asignará como entrada para crear un objeto de sopa.
soup_object = BeautifulSoup(html_page)
Las siguientes dos líneas imprimirá el nombre del título con etiquetas y sin etiquetas, respectivamente.
print soup_object.title
print soup_object.title.text
La línea de código que se muestra a continuación guardará todos los hipervínculos.
for link in soup_object.find_all('a'):
print(link.get('href'))
Agarrar pancartas
Banner es como un mensaje de texto que contiene información sobre el servidor y la captura de banner es el proceso de obtener esa información proporcionada por el propio banner. Ahora, necesitamos saber cómo se genera este banner. Es generado por el encabezado del paquete que se envía. Y mientras el cliente intenta conectarse a un puerto, el servidor responde porque el encabezado contiene información sobre el servidor.
La siguiente secuencia de comandos de Python ayuda a capturar el banner mediante la programación de socket:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))
targethost = str(raw_input("Enter the host name: "))
targetport = int(raw_input("Enter Port: "))
s.connect((targethost,targetport))
def garb(s:)
try:
s.send('GET HTTP/1.1 \r\n')
ret = sock.recv(1024)
print ('[+]' + str(ret))
return
except Exception as error:
print ('[-]' Not information grabbed:' + str(error))
return
Después de ejecutar el script anterior, obtendremos un tipo de información similar sobre los encabezados a la que obtuvimos del script Python de huellas de encabezados HTTP en la sección anterior.