• Crear una skill de Claude

    Una skill de Claude es un paquete de instrucciones y recursos que transforma a Claude en un agente especializado en tareas concretas. Esta formada por una estructura de archivos y carpetas que ponemos en diferentes ubicaciones para lograr diferentes objetivos.

    Si queremos que la skill esté disponible globalmente, ponemos la carpeta de la skill dentro de la carpeta:

    ~/.claude/skills/

    Si queremos que sólo esté disponible para un proyecto específico creamos la carpeta skills dentro de la carpeta del proyecto y ponemos todas las subcarpetas de skills dentro de ella.

    La estructura de archivos y carpetas de la skill debe ser así:

    skills/                               (Carpeta de skills)
    ├── nombre-de-la-skill/
        ├── SKILL.md                      (Obligatorio)
        │   ├── YAML frontmatter          (Nombre + descripción)
        │   └── Instrucciones en Markdown
        │
        └── Recursos opcionales:
            ├── scripts/                  (Código ejecutable: Python, Bash,etc)
            ├── references/               (Documentación para cargar en contexto)
            └── assets/                   (Archivos para usar en outputs: plantillas, imágenes, fuentes, etc)

    Estructura del archivo SKILL.md:

    ---
    name: nombre-de-la-skill
    description: Qué hace y cuándo usarla. Esta descripción es clave porque determina cuándo Claude activa la skill.
    ---
     
    # Instrucciones en Markdown
    ...
    ```
     
    ### scripts/
    Código que se ejecuta repetidamente sin necesidad de reescribirlo cada vez.
    ```
    scripts/
    ├── rotate_pdf.py
    ├── scan_network.sh
    └── process_data.py
    ```
     
    ### references/
    Documentación que Claude carga en contexto cuando la necesita.
    ```
    references/
    ├── api_docs.md
    ├── database_schema.md
    └── company_policies.md
    ```
     
    ### assets/
    Archivos que se usan en el output, no se cargan en contexto.
    ```
    assets/
    ├── logo.png
    ├── template.pptx
    └── fonts/

    Ejemplo de un archivo SKILL.md completo:

    ---
    name: ctf-file-analyzer
    description: Análisis inicial de archivos sospechosos para retos CTF de forensics y esteganografía. Úsala cuando el usuario proporcione un archivo desconocido de un CTF o pida analizar binarios, imágenes o capturas en busca de flags ocultas.
    allowed-tools: Bash(file *) Bash(strings *) Bash(exiftool *) Bash(binwalk *) Bash(zsteg *) Bash(steghide *)
    ---
     
    # Analizador de archivos para CTFs
     
    Cuando el usuario aporte un archivo para analizar, sigue estos pasos en orden y documenta cada hallazgo con el comando exacto utilizado.
     
    ## 1. Identificación inicial
     
    - Ejecuta `file ` para detectar el tipo real (nunca te fíes de la extensión).
    - Calcula los hashes con `md5sum` y `sha256sum` por si hay que buscarlos en VirusTotal o en bases públicas.
    - Comprueba el tamaño con `ls -la` (un archivo con tamaño anómalo suele ocultar algo).
     
    ## 2. Análisis de cadenas
     
    - `strings -n 8 ` y busca patrones típicos: `flag{`, `CTF{`, `HTB{`, `FLAG=`, base64, hex largo.
    - Para binarios, prueba también codificaciones anchas: `strings -e l` (UTF-16 LE) y `strings -e b` (UTF-16 BE).
     
    ## 3. Metadatos
     
    - Imágenes: `exiftool ` (mira siempre el campo Comment, Artist y los XMP).
    - PDFs: `pdfinfo` y `pdf-parser -s` para objetos sospechosos.
    - Ofimáticos (docx, xlsx, pptx): son ZIPs, descomprime con `unzip` e inspecciona el XML.
     
    ## 4. Archivos embebidos
     
    - `binwalk -e ` para extraer archivos ocultos por concatenación o magic bytes.
    - `foremost ` como alternativa cuando binwalk no encuentra nada.
     
    ## 5. Esteganografía (sólo si es imagen o audio)
     
    - PNG/BMP: `zsteg -a ` para LSB y todos los canales.
    - JPG/WAV: `steghide info `. Si pide contraseña, intenta vacía y luego `stegseek` con `rockyou.txt`.
    - Audio: abrir el espectrograma en Sonic Visualiser (se le indica al usuario, no se ejecuta).
     
    ## Reglas importantes
     
    - **Nunca ejecutes un binario desconocido** fuera de una sandbox. Si el usuario lo pide, advierte y propón usar una VM o Docker aislado.
    - Si encuentras una posible flag, márcala claramente con el formato detectado y el comando que la reveló.
    - Si tras estos pasos no aparece nada, sugiere herramientas más específicas según el tipo de reto (volatility para memoria, wireshark para pcaps, ghidra para binarios ELF/PE).

    Cómo activa Claude una skill

    Claude no carga el contenido completo de todas las skills disponibles en cada conversación, eso sería un desperdicio enorme de contexto. Lo que hace es leer únicamente el campo description del YAML frontmatter de cada skill (lo que se llama progressive disclosure) y, cuando detecta que tu petición encaja con alguna de esas descripciones, carga el cuerpo completo de la skill en el contexto. Esto significa que la descripción es la parte más crítica de toda la skill. Una descripción mal redactada hace que Claude no active la skill aunque encajara perfectamente, o peor, que la active cuando no toca. Hay dos errores típicos:

    ❌ Mal: "Ayuda con documentos."
    ✅ Bien: "Genera informes semanales de pentesting con la plantilla de la empresa. Úsala cuando el usuario pida un informe, un reporte de vulnerabilidades o un resumen de hallazgos."

    La regla práctica es: escribe la descripción como si le estuvieras explicando a Claude exactamente cuándo debe usarla, con palabras que el usuario diría de forma natural. La descripción tiene un límite de 1.536 caracteres combinados con el campo opcional when_to_use, así que el caso de uso principal debe ir al principio.

    Invocación manual

    Además del disparo automático por descripción, cualquier skill se puede ejecutar manualmente escribiendo una barra seguida del nombre de la carpeta:

    /ctf-file-analyzer

    También se le pueden pasar argumentos, que estarán disponibles dentro del SKILL.md mediante el placeholder $ARGUMENTS (o $0, $1, $2… para posiciones concretas):

    ---
    name: cve-lookup
    description: Busca información sobre un CVE concreto y resume su impacto.
    ---
     
    Busca información sobre $ARGUMENTS:
     
    1. Consulta NVD y MITRE
    2. Resume el vector de ataque (CVSS)
    3. Indica si hay exploit público disponible

    Con lo anterior, al ejecutar /cve-lookup CVE-2024-3094, Claude recibe la instrucción ya sustituida con el identificador concreto.

    Campos avanzados del frontmatter

    El YAML frontmatter admite bastantes más campos que name y description. Los más útiles en la práctica son:

    ---
    name: deploy-staging
    description: Despliega la aplicación al entorno de staging.
    disable-model-invocation: true
    allowed-tools: Bash(git *) Bash(docker *) Bash(kubectl *)
    paths: infra/**, k8s/**
    context: fork
    agent: general-purpose
    ---
    • disable-model-invocation: true: impide que Claude lance la skill por su cuenta. Solo se ejecuta si tú escribes /deploy-staging. Imprescindible para acciones con efectos secundarios (despliegues, borrados, envío de correos).
    • allowed-tools: lista de herramientas que la skill puede usar sin pedirte confirmación. Te ahorra confirmar cada git add o docker build cuando ya has aprobado la skill entera.
    • paths: globs que limitan la activación automática a cuando se está trabajando con archivos concretos. Útil para skills específicas de una parte del proyecto.
    • context: fork: ejecuta la skill en un subagente con contexto aislado. La skill no ve tu historial de conversación y los resultados se devuelven resumidos. Ideal para tareas pesadas de investigación que ensuciarían el contexto principal.

    Inyección dinámica de contexto

    Una de las funciones más potentes es poder ejecutar comandos de shell antes de que Claude lea la skill, e inyectar su salida directamente en las instrucciones. La sintaxis es escribir el comando entre acentos graves precedidos de una exclamación al principio de la línea:

    ---
    name: nmap-summary
    description: Resume los resultados del último escaneo nmap del proyecto.
    allowed-tools: Bash(cat *) Bash(ls *)
    ---
     
    ## Último escaneo
    !`ls -t scans/*.xml | head -1 | xargs cat`
     
    ## Tu tarea
    Resume los puertos abiertos por host, agrupa por servicio y destaca cualquier
    versión vulnerable conocida. Genera una tabla en markdown.

    Cuando se invoque la skill, el comando se ejecuta primero y su salida sustituye al placeholder. Claude recibe ya el XML del último escaneo como si lo hubieras pegado tú a mano. Esto es muchísimo más fiable que dejar a Claude buscar el archivo por su cuenta.

    Buenas prácticas

    Después de crear unas cuantas skills, hay algunas reglas que merece la pena interiorizar:

    • Mantén el SKILL.md por debajo de 500 líneas. Si crece más, mueve la documentación detallada a archivos dentro de references/ y enlázalos desde el SKILL.md indicando cuándo cargarlos. Claude solo los leerá si los necesita.
    • Escribe el cuerpo como instrucciones permanentes, no como pasos puntuales. Una vez cargada, la skill se mantiene en contexto durante toda la sesión, por lo que conviene redactarla como una guía estable y no como una orden única.
    • Usa scripts en lugar de pedirle a Claude que haga cálculos complejos. Para algoritmos deterministas (hashes, cifrados, parseos), es mejor un script de Python en scripts/ que dejar que Claude lo resuelva turno a turno.
    • Versiona las skills del proyecto. La carpeta .claude/skills/ de un proyecto debería estar bajo control de versiones para que el equipo entero comparta la misma configuración. Las skills personales en ~/.claude/skills/ son sólo para ti.
    • Cuidado con las skills de terceros. Antes de aceptar un repositorio que tiene skills propias, revísalas: el campo allowed-tools puede conceder permisos amplios sin que te enteres.

    Los comentarios están cerrados.