Camada de aplicação
Os aplicativos e servidores da Web são essenciais para nossa presença online e os ataques observados contra eles constituem mais de 70% do total de ataques tentados na Internet. Esses ataques tentam converter sites confiáveis em mal-intencionados. Por esse motivo, o teste de caneta de servidor e aplicativo da Web desempenha um papel importante.
Footprint de um servidor web
Por que precisamos considerar a segurança dos servidores web? É porque, com o rápido crescimento da indústria de e-commerce, o principal alvo dos invasores é o servidor web. Para testes de servidor web, devemos saber sobre o servidor web, seu software de hospedagem e sistemas operacionais, juntamente com os aplicativos que estão sendo executados neles. A coleta de tais informações sobre o servidor web é chamada de footprinting do servidor web.
Em nossa seção subsequente, discutiremos os diferentes métodos de footprinting de um servidor web.
Métodos de pegada de um servidor web
Os servidores da Web são software ou hardware de servidor dedicado a lidar com solicitações e atender a respostas. Esta é uma área chave para um pentester se concentrar enquanto faz o teste de penetração de servidores web.
Vamos agora discutir alguns métodos, implementados em Python, que podem ser executados para o footprint de um servidor web -
Teste de disponibilidade de métodos HTTP
Uma prática muito boa para um testador de penetração é começar listando os vários métodos HTTP disponíveis. A seguir está um script Python com a ajuda do qual podemos nos conectar ao servidor web de destino e enumerar os métodos HTTP disponíveis -
Para começar, precisamos importar a biblioteca de solicitações -
import requests
Depois de importar a biblioteca de solicitações, crie um array de métodos HTTP, que iremos enviar. Faremos uso de alguns métodos padrão como 'GET', 'POST', 'PUT', 'DELETE', 'OPTIONS' e um método não padrão 'TEST' para verificar como um servidor web pode lidar com a entrada inesperada.
method_list = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'TRACE','TEST']
A linha de código a seguir é o loop principal do script, que enviará os pacotes HTTP para o servidor da web e imprimirá o método e o código de status.
for method in method_list:
req = requests.request(method, 'Enter the URL’)
print (method, req.status_code, req.reason)
A próxima linha testará a possibilidade de rastreamento entre sites (XST) enviando o método TRACE.
if method == 'TRACE' and 'TRACE / HTTP/1.1' in req.text:
print ('Cross Site Tracing(XST) is possible')
Depois de executar o script acima para um servidor web específico, obteremos 200 respostas OK para um método específico aceito pelo servidor web. Obteremos uma resposta 403 Forbidden se o servidor web negar explicitamente o método. Assim que enviarmos o método TRACE para testar o rastreamento entre sites (XST), obteremos405 Not Allowed respostas do servidor web, caso contrário, receberemos a mensagem ‘Cross Site Tracing(XST) is possible’.
Footprint verificando cabeçalhos HTTP
Os cabeçalhos HTTP são encontrados em solicitações e respostas do servidor da web. Eles também carregam informações muito importantes sobre os servidores. É por isso que o testador de penetração está sempre interessado em analisar informações por meio de cabeçalhos HTTP. A seguir está um script Python para obter as informações sobre os cabeçalhos do servidor web -
Para começar, vamos importar a biblioteca de solicitações -
import requests
Precisamos enviar uma solicitação GET para o servidor web. A linha de código a seguir faz uma solicitação GET simples por meio da biblioteca de solicitações.
request = requests.get('enter the URL')
A seguir, geraremos uma lista de cabeçalhos sobre os quais você precisa das informações.
header_list = [
'Server', 'Date', 'Via', 'X-Powered-By', 'X-Country-Code', ‘Connection’, ‘Content-Length’]
O próximo é um bloco try e 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)
Depois de executar o script acima para um servidor da web específico, obteremos as informações sobre os cabeçalhos fornecidos na lista de cabeçalhos. Se não houver informações para um cabeçalho específico, será exibida a mensagem 'Nenhum detalhe encontrado'. Você também pode aprender mais sobre os campos HTTP_header no link -https://www.tutorialspoint.com/http/http_header_fields.htm.
Teste de configurações de servidor da web inseguras
Podemos usar informações de cabeçalho HTTP para testar configurações inseguras do servidor da web. No script Python a seguir, vamos usar o bloco try / except para testar cabeçalhos de servidor da web não seguros para o número de URLs que são salvos em um nome de arquivo 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')
Pegada de um aplicativo da web
Em nossa seção anterior, discutimos a pegada de um servidor da web. Da mesma forma, a pegada de um aplicativo da web também é considerada importante do ponto de vista de um testador de penetração.
Em nossa seção subsequente, aprenderemos sobre os diferentes métodos de footprinting de um aplicativo da web.
Métodos de pegada de um aplicativo da Web
O aplicativo da Web é um programa cliente-servidor executado pelo cliente em um servidor da web. Esta é outra área-chave para um pentester se concentrar ao fazer o teste de penetração do aplicativo da web.
Vamos agora discutir os diferentes métodos, implementados em Python, que podem ser usados para o footprint de um aplicativo da web -
Coletando informações usando o analisador BeautifulSoup
Suponha que queremos coletar todos os hiperlinks de uma página da web; podemos usar um analisador chamado BeautifulSoup. O analisador é uma biblioteca Python para extrair dados de arquivos HTML e XML. Pode ser usado comurlib porque ele precisa de uma entrada (documento ou url) para criar um objeto sopa e não pode buscar a página da web sozinho.
Para começar, importemos os pacotes necessários. Vamos importar urlib eBeautifulSoup. Lembre-se de que antes de importar o BeautifulSoup, precisamos instalá-lo.
import urllib
from bs4 import BeautifulSoup
O script Python fornecido abaixo reunirá o título da página da web e hiperlinks -
Agora, precisamos de uma variável, que pode armazenar a URL do site. Aqui, usaremos uma variável chamada 'url'. Também usaremos opage.read() função que pode armazenar a página da web e atribuir a página da web à variável html_page.
url = raw_input("Enter the URL ")
page = urllib.urlopen(url)
html_page = page.read()
o html_page será atribuído como uma entrada para criar o objeto sopa.
soup_object = BeautifulSoup(html_page)
As duas linhas seguintes imprimirão o nome do título com tags e sem tags, respectivamente.
print soup_object.title
print soup_object.title.text
A linha de código mostrada abaixo salvará todos os hiperlinks.
for link in soup_object.find_all('a'):
print(link.get('href'))
Agarrando banner
O banner é como uma mensagem de texto que contém informações sobre o servidor e a captura do banner é o processo de buscar as informações fornecidas pelo próprio banner. Agora, precisamos saber como esse banner é gerado. Ele é gerado pelo cabeçalho do pacote enviado. E enquanto o cliente tenta se conectar a uma porta, o servidor responde porque o cabeçalho contém informações sobre o servidor.
O seguinte script Python ajuda a pegar o banner usando a programação 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
Depois de executar o script acima, obteremos informações semelhantes sobre os cabeçalhos que obtivemos no script Python de footprinting de cabeçalhos HTTP na seção anterior.