Escáner básico de sitios web para subpáginas en Python
¡Hola a todos! En el artículo de hoy, hablaré sobre cómo podemos crear una versión simple de una herramienta que se puede usar en pruebas de penetración para encontrar subpáginas existentes para sitios web. Como lo indica el título, usaré Python, pero esto no es obligatorio, porque también se puede hacer en otros idiomas.
● ¿ Qué hace un escáner de sitios web?
El propósito de este tipo de escáner es detectar si existen subpáginas específicas en un determinado sitio web. En caso de que esté familiarizado con el término ataque de fuerza bruta para contraseñas, el principio es casi el mismo, solo que en lugar de contraseñas tiene subpáginas.
Hay 2 piezas obligatorias: el sitio web donde se debe realizar el escaneo y un archivo de texto que contiene una lista de posibles subpáginas.
● Un ejemplo simple para una mejor comprensión
Consideremos https://www.nicevintagecars.com como nuestro sitio web (hipotético, no existe). Es bastante simple, con solo 4 elementos en el menú: Inicio , Acerca de , Galería y Contacto . Si alguien navega por el sitio, solo encontrará las páginas mencionadas anteriormente. Sin embargo, no significa automáticamente que esos son los únicos disponibles. A veces, las cosas existen, aunque no sean visibles.
Tenemos uno de los 2 elementos necesarios, queda otro. Nuestro archivo de texto podría constar de un par de subpáginas posibles: admin , secret , luxury , Auction y Owners .
Basado en los 2 componentes de nuestro ejemplo, el escáner probará la existencia de los siguientes enlaces:
▪ https://www.nicevintagecars.com/admin
▪ https://www.nicevintagecars.com/secret
▪ https://www.nicevintagecars.com/luxury
▪ https://www.nicevintagecars.com/auction
▪ https ://www.nicevintagecars.com/propietarios
Algunos de ellos podrían existir, algunos de ellos no. O tal vez ninguno de esos existe. Pero el escáner puede ayudarnos a descubrir.
● ¿ Cómo sabemos si existe una página?
Diría que simplemente escribe el enlace en el navegador, presiona <Entrar> y ve si aparece algo. Cual es correcta. Pero no es una opción adecuada para nuestro programa. No es una solución factible incluso para usted, en caso de que su lista tenga 1000 líneas.
La historia detrás del cheque es la siguiente: cuando el cliente accede a la página web en su navegador, envía una solicitud al servidor donde está alojado el sitio web. En esa solicitud, demanda un recurso. El servidor devuelve una respuesta y, en función del código de estado recibido, se determina el resultado. Si es 200, la página carga bien (este es el código más común). Un código de estado 404 implica no encontrar la página.
Una página puede existir en un sitio web, aunque el código de estado recibido no sea 200. Por ejemplo, puede obtener 401 o 403. Esto no significa que no se encontró la página, simplemente no está autenticado o no está autorizado.
● Pasos en nuestro algoritmo
Hay 3 fases que considero imprescindibles:
▪ obtener la entrada
Como dice, necesitamos configurar nuestros 2 elementos requeridos, la página web y la lista de directorios (o incluso archivos, también funciona en este caso).
▪ crear la lista completa de URL para escanear
En este paso, para cada línea de nuestro archivo de texto, tomaremos ese valor y lo agregaremos al final de la URL principal, separándolos con un carácter "/". A continuación, almacenaremos el enlace final en una variable de tipo lista.
▪ enviar solicitudes para cada URL y determinar su estado
Como paso final, tomaremos la lista creada previamente y la analizaremos. Para cada enlace, enviaremos una solicitud de obtención y verificaremos si su código de estado es 200. Si es así, solo mostraremos que el enlace es válido.
Hay un enfoque diferente que tuve cuando creé una versión avanzada de esta herramienta. No filtré los resultados por el código de estado 200, solo excluí los que tienen 404. Como dije anteriormente, existen algunas páginas aunque el código de estado no sea 200.
Puede encontrar esta versión en mi perfil de GitHub, utilizando el siguiente enlace:
● Codificando nuestro programa
El código que presentaré aquí es el básico, el mínimo necesario para que esta herramienta funcione.
De acuerdo con los pasos presentados anteriormente, lo primero que debe hacer es obtener nuestra entrada. Creé 2 variables para almacenar cada uno de esos 2 elementos, pero también importé el módulo de solicitudes . Lo necesitaremos más adelante cuando vayamos a enviar solicitudes de obtención. Tenga en cuenta que este no es un módulo de Python predeterminado, por lo que debe instalarlo primero.
import requests
# Define variables
main_url = "https://www.nicevintagecars.com"
wordlist = "directories.txt" # Directories must be each on a different row
# Create list of URLs to scan
full_url_list = []
dirs = open(wordlist, 'r')
for directory in dir:
url = main_url + "/" + directory.strip()
full_url_list.append(url)
# Send get requests to URLs
print("Scan started...\n")
for url in full_url_list:
url_request = requests.get(url)
if url_request.status_code == 200:
print("Found:", url)
print("\nScan finished!")
En el video a continuación, puede ver el tutorial completo donde creo este escáner, lo ejecuto y también verifico los resultados que obtuve. ¡Echar un vistazo!
● Descargo de responsabilidad
Este artículo es solo para fines educativos. El uso de la herramienta para atacar objetivos sin previo consentimiento mutuo es ilegal. No asumo ninguna responsabilidad y no soy responsable de ningún mal uso o daño causado por esta herramienta.
Eso es todo por ahora, espero que lo hayan disfrutado. ¡Gracias por el tiempo que te tomaste para leer esto! ¡Nos vemos en mi próximo artículo!

![¿Qué es una lista vinculada, de todos modos? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































