La inteligencia artificial se refiere a la amplia disciplina de la informática dedicada a crear sistemas capaces de realizar tareas que normalmente requieren inteligencia humana. Dentro de este campo, los modelos de lenguaje grandes son una clase especializada de sistemas de IA estadísticos entrenados con corpus de texto masivos para predecir y generar lenguaje coherente. Algunos ejemplos destacados son ChatGPT, Grok xAI, Claude y Gemini, que destacan en funciones de traducción, resumen y conversación, pero que operan mediante la comparación de patrones en lugar de una comprensión genuina.

Los críticos argumentan que la confusión entre IA y LLM pasa por alto la diversidad de la investigación en IA, que también abarca áreas como la visión por ordenador, la robótica, los sistemas expertos y la toma de decisiones autónoma.

No estamos aquí para discutir la ciencia de la IA o los LLM, sino que nos vamos a centrar en los usos de la IA en la ciberdefensa.

Los temas de esta sección incluyen lo siguiente:

  1. Diferentes tipos de utilización de la IA: Prompting, RAG y ajuste fino
  2. Configuración de una API de IA
  3. Prompting con IA

Diferentes tipos de utilización de la IA: Prompting, RAG y ajuste fino

Contexto y objetivo

Nuestro objetivo es analizar las publicaciones en foros de ciberdelincuencia para identificar cuáles tratan sobre la venta de acceso inicial (IAB). Las publicaciones se clasifican en:

  • Publicaciones positivas: venta directa de acceso no autorizado a una empresa (por ejemplo, «Acceso inicial a RBC Bank disponible»).
  • Publicaciones neutras: ofertas generales de herramientas, exploits o malware sin nombrar un objetivo específico.
  • Publicaciones negativas: servicios fuera de tema o no relacionados, como alojamiento, herramientas de spam o venta de VPS genéricos.

Prompting con IA

El prompting utiliza API preentrenadas (por ejemplo, OpenAI, xAI, Anthropic) enviando prompts elaborados y recibiendo respuestas sin modificar.

Costes y gastos técnicos generales

  • Las llamadas a API de terceros varían de bajas (GPT-3.5 a ~0,002 $ por 1000 tokens) a medias (GPT-4 a ~0,03-0,06 $ por 1000 tokens).

  • El autohospedaje conlleva costes de hardware (servidores GPU a 2-3 $/hora) y derechos de licencia para los modelos abiertos.

  • Infraestructura mínima más allá del almacenamiento seguro para registros de prompts y claves API.

Almacenamiento de datos Solo plantillas de prompts, registros y metadatos posteriores; normalmente unos pocos megabytes al día.

Consideraciones de privacidad El envío de información confidencial sobre amenazas a API externas puede violar la confidencialidad. Los modelos locales mejoran la privacidad, pero aumentan los costes de infraestructura y formación.

Facilidad de adopción Las indicaciones son la forma más rápida de empezar a utilizar la CTI, ya que no requieren formación en modelos y la configuración es mínima.

Generación aumentada por recuperación (RAG)

La RAG combina un almacén de documentos de datos de CTI con un LLM. Recupera pasajes relevantes (por ejemplo, de informes de malware o archivos de fugas) para aumentar el contexto de las indicaciones.

Componentes básicos y costes

  1. Almacén vectorial (por ejemplo, FAISS, Pinecone)

  2. Modelo de incrustación (incrustaciones de OpenAI o alternativas de código abierto)

  3. LLM

  4. LLM líderes en la nube: GPT-4, Claude 2

  5. Modelos autohospedados: Llama 2-70B, Mistral Instruct

Los costes de inferencia en la nube incluyen llamadas de incrustación y llamadas de generación (similares a las indicaciones). El autohospedaje requiere GPU (A100 o equivalente), con 40-80 GB de VRAM para modelos grandes.

Sobrecarga técnica La configuración de un canal de recuperación, la indexación de documentos y el mantenimiento de bases de datos vectoriales requieren conocimientos técnicos.

Almacenamiento de datos Almacenamiento del corpus (de decenas a cientos de gigabytes) más índices vectoriales (aproximadamente entre 2 y 5 veces el tamaño del corpus).

Requisitos informáticos

  • Incrustación: unos segundos por documento en GPU

  • Generación: depende del tamaño del modelo; los modelos GPT-4 o 70 B-parameter necesitan GPU de gama alta para una inferencia de baja latencia.

Ajuste

El ajuste adapta un LLM a la CTI mediante el entrenamiento con ejemplos etiquetados (por ejemplo, clasificaciones de publicaciones o resúmenes de informes de amenazas).

Los mejores LLM de razonamiento y necesidades informáticas

  • Nube†: ajuste fino de GPT-3.5 y GPT-4 (requiere un mínimo de recursos informáticos por parte del usuario).
  • Autoalojado: Mistral 7B/13B, variantes de Llama 2, serie Falcon.
  • El ajuste fino de modelos grandes (30 B+ parámetros) requiere varias GPU A100 y puede llevar de horas a días.

Costes y gastos técnicos generales

  • Nube: tarifas de ajuste basadas en tokens (entre 0,03 y 0,12 dólares por cada 1000 tokens) más el almacenamiento del modelo ajustado.
  • En las instalaciones: alquiler de clústeres de GPU (entre 3 y 10 dólares por hora por GPU), canalizaciones de preprocesamiento de datos y mantenimiento de la infraestructura de formación.

Almacenamiento de datos Conjuntos de datos de entrenamiento (hasta varios gigabytes) más puntos de control del modelo final (10-200 GB dependiendo del tamaño).

Para empezar con el ajuste fino, aquí tienes un conjunto de datos de ejemplo que puedes utilizar:

https://github.com/0xHamy/minimal_scraper/tree/main/datasets

Para generar más datos similares, puede utilizar API de párrafos.

Resumen comparativo

| Aspecto | Prompting | RAG | Ajuste fino | |----------------------|-------------------------------|---------------------------------------------|--------------------------------------| | Privacidad | Baja (API pública) o alta (local) | Media (corpus local, LLM público) | Alta (modelo local) | | Tiempo de configuración | Minutos | Horas a días | Días a semanas | | Infraestructura | Mínima | Moderada (base de datos vectorial, servidor de recuperación) | Extensa (flota de GPU, pila de entrenamiento) | | Perfil de costes | Bajo a medio | Medio a alto | Alto | | Almacenamiento de datos | Registros y metadatos | Documentos + índices | Datos de entrenamiento + puntos de control del modelo | | Razonamiento del modelo | Limitado al diseño de prompts | Mejorado por la recuperación de contexto | Mejor alineación de dominios | | Curva de aprendizaje | Muy fácil | Intermedio | Difícil |


Configuración de una API de IA

Como se ha señalado anteriormente, las indicaciones son la forma más sencilla de empezar. Pero, ¿cómo seleccionamos los modelos adecuados para nuestras tareas?

Los proveedores de IA que se enumeran a continuación ofrecen una gama de modelos más allá de los mencionados. Le animo a que explore sus ofertas y comprenda sus capacidades. Tenga en cuenta que las suscripciones a IA (por ejemplo, para ChatGPT o Claude) difieren de las API de IA, que requieren la compra de créditos API. Estos suelen empezar en 5 dólares y tienen una duración considerable.

Anthropic

Claude 3.5 Sonnet, de Anthropic, es un modelo que utilizo con frecuencia. Destaca por su capacidad de razonamiento y cuenta con sólidas barreras de seguridad, lo que lo hace ideal para identificar publicaciones relacionadas con ventas de acceso inicial, discurso de odio o ciberacoso. Además, funciona bien en el reconocimiento óptico de caracteres (OCR), especialmente para resolver CAPTCHA, ya que extrae el texto de las imágenes de forma eficaz.

Empezar:

https://www.anthropic.com/api

xAI

Grok 3 de xAI es excepcional para escribir y analizar grandes bases de código, ya que puede manejar hasta 2000 líneas de código. Aunque es adecuado para el análisis de malware, es menos eficaz en tareas de razonamiento, como los debates, en los que le cuesta generar argumentos únicos. Claude 3.5 Sonnet supera a Grok 3 en razonamiento general y debates, pero Grok 3 lidera las tareas de codificación.

Para empezar:

https://x.ai/api

OpenAI

OpenAI ofrece varios modelos, entre los que destaca o1 para la depuración de código y la resolución de errores. Este modelo ha sido muy valioso para solucionar problemas en grandes bases de código. A medida que desarrolles plataformas CTI extensas, encontrarás numerosos errores, y o1 es una herramienta fiable para encontrar soluciones.

Para empezar:

https://openai.com/api/


Prompts de IA

Los proveedores de API de IA mencionados anteriormente ofrecen documentación completa que detalla cómo interactuar con sus API utilizando lenguajes de programación como Python o JavaScript. En esta sección, profundizaré y explicaré cómo aprovechar la IA de Anthropic para casos de uso específicos, como distinguir las publicaciones que discuten las ventas de acceso inicial de aquellas que no lo hacen.

Identificar una venta de acceso inicial con Claude

Para identificar las ventas de acceso inicial con Claude, podemos solicitar la inferencia de la IA. Para empezar, configura un entorno virtual Python:

mkdir ai_prompting && cd ai_prompting
python3 -m venv venv
source venv/bin/activate
pip install anthropic
touch iab_identifier.py

Abre «iab_identifier.py» y pega el siguiente código:

from anthropic import Anthropic
import json


def claude_classify(
    api_key: str,
    model_name: str,
    post_content: str,
    max_tokens: int = 100,
    temperature: float = 0.1
) -> dict:
    """
    Classify a post using Claude (e.g., Sonnet) to determine if it discusses selling initial access,
    unrelated items, or warnings/complaints.

    Args:
        api_key (str): Anthropic API key.
        model_name (str): Claude model name (e.g., 'claude-3-5-sonnet-20241022').
        post_content (str): Post text to classify.
        max_tokens (int, optional): Max output tokens. Defaults to 100.
        temperature (float, optional): Sampling temperature. Defaults to 0.1.

    Returns:
        dict: JSON with classification, scores, and error (if any).
    """
    client = Anthropic(api_key=api_key)
    prompt_template = """
    Does this post discuss selling initial access to a company (e.g., RDP, VPN, admin access), selling unrelated items (e.g., accounts, tools), or warnings/complaints? Classify it as:
- Positive Posts: direct sale of unauthorized access to a company, this usually include the target's name.
- Neutral Posts: general offers for tools, exploits or malware without naming a specific target.
- Negative Posts: off-topic or unrelated services such as hosting, spam tools or generic VPS sales.

The content must be specifically about selling access to a company or business whose name is mentioned in the post. 

Return **only** a JSON object with:
- `classification`: "Positive", "Neutral", or "Negative".
- `scores`: Probabilities for `positive`, `neutral`, `negative` (summing to 1).

Wrap the JSON in ```json
{
  ...
}
``` to ensure proper formatting. Do not include any reasoning or extra text.

Post:
```markdown
{{POST}}
``` 
"""
    prompt = prompt_template.replace("{{POST}}", post_content)

    try:
        message = client.messages.create(
            model=model_name,
            max_tokens=max_tokens,
            temperature=temperature,
            messages=[
                {"role": "user", "content": prompt}
            ]
        )
        content = message.content[0].text
        # Extract JSON between ```json and ```
        start = content.index("```json\n") + 7
        end = content.index("\n```", start)
        result = json.loads(content[start:end])
        return result
    except Exception as e:
        return {"error": f"Failed to classify post: {str(e)}", "classification": None, "scores": None}


# Example usage 
if __name__ == "__main__":
    API_KEY = "" 
    MODEL_NAME = "claude-3-7-sonnet-20250219"

    sample_post = """Selling access to Horizon Logistics\nRevenue: $1.2B\nAccess: RDP with DA\nPrice: 0.8 BTC\nDM for details"""

    result = claude_classify(
        api_key=API_KEY,
        model_name=MODEL_NAME,
        post_content=sample_post,
        max_tokens=100,
        temperature=0.1
    )
    print("API response:")
    print(json.dumps(result, indent=4))

Esto se denomina cadena de documentación de función:

    """
    Classify a post using Claude (e.g., Sonnet) to determine if it discusses selling initial access,
    unrelated items, or warnings/complaints.

    Args:
        api_key (str): Anthropic API key.
        model_name (str): Claude model name (e.g., 'claude-3-5-sonnet-20241022').
        post_content (str): Post text to classify.
        max_tokens (int, optional): Max output tokens. Defaults to 100.
        temperature (float, optional): Sampling temperature. Defaults to 0.1.

    Returns:
        dict: JSON with classification, scores, and error (if any).
    """

Las cadenas de documentación se utilizan para documentar cómo funciona el código.

Este código también se puede utilizar como módulo. Por ejemplo, puede importar claude_classify desde iab_identifier.py, pasar los argumentos necesarios y utilizarlo.

Aquí definimos una instrucción condicional, if __name__ == «__main__»:, para comprobar si el programa se está ejecutando como un script. Si es así, se ejecuta el código dentro del bloque condicional.

Para utilizarlo, establezca su clave API en la variable API_KEY y especifique el nombre del modelo en la variable MODEL_NAME. Para sample_post, puede proporcionar una sola publicación o una lista de publicaciones e iterarlas.

A continuación se muestra un ejemplo en el que se utilizan tres publicaciones, como positive, neutral y negative, procedentes del siguiente conjunto de datos:

https://github.com/0xHamy/minimal_scraper/blob/main/datasets/base.csv

# Example usage 
if __name__ == "__main__":
    API_KEY = "sk-ant-apixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
    MODEL_NAME = "claude-3-5-sonnet-20241022"

    sample_posts = ["Selling access to Capital Freight Co. (Texas-based logistics) \nRevenue: ~$900M \nAccess: Full RDP, domain admin via svc_x backup creds \nExtras: Internal invoices, mapped drives, Outlook web creds \nEDR: minimal – Defender only \nPrice: 0.6 BTC firm, BTC only, DM me quick", 
	"Private obfuscator for Python tools \nRandom junk + encryption \nFUD for most stealers \n0.012 BTC",
	"Selling 150k+ Netflix logins from Latin America \nMost accounts active, pulled from private stealer logs \nNo warranty – buy at your own risk \n0.02 BTC per 1k – discounts on bulk \nDM for sample"
	]

    for idx, post in enumerate(sample_posts, start=1):
        result = claude_classify(
            api_key=API_KEY,
            model_name=MODEL_NAME,
            post_content=post,
            max_tokens=100,
            temperature=0.1
        )
        print(f"API response for post number {idx}:\n")
        print(json.dumps(result, indent=4))
        print(60 * '*')

Aquí está el resultado:

-> % python3 iab_identifier.py
API response for post number 1:

{
    "classification": "Positive",
    "scores": {
        "positive": 0.95,
        "neutral": 0.04,
        "negative": 0.01
    }
}
************************************************************
API response for post number 2:

{
    "classification": "Neutral",
    "scores": {
        "positive": 0.05,
        "neutral": 0.85,
        "negative": 0.1
    }
}
************************************************************
API response for post number 3:

{
    "classification": "Negative",
    "scores": {
        "positive": 0.05,
        "neutral": 0.15,
        "negative": 0.8
    }
}
************************************************************

Este enfoque es muy eficaz y realiza la tarea rápidamente. Aunque las API pueden clasificar erróneamente en ocasiones las publicaciones «neutras» y «negativas», identifican de forma coherente y precisa las publicaciones «positivas», lo cual es fundamental. La actividad delictiva cibernética general suele entrar en las categorías «negativa» o «neutra», pero las ventas de acceso inicial siempre se pueden distinguir de forma fiable.