Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
transfer.sh — Compartir archivos fácil y rápido desde la línea de comandos. | Kitploit
Herramientas/GitHubGitHub/dutchcoders/transfer.sh
Utilidades de Propósito GeneralHerramientas de Cifrado/DescifradoExfiltración de Datos
GitHubdutchcoders/transfer.sh

transfer.sh

Compartir archivos fácil y rápido desde la línea de comandos.

Ver Repositorio
15.9k1.6khace 2 mesesRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

ADVERTENCIA DE SEGURIDAD

Bypass del filtro IP y autenticación HTTP mediante suplantación de cabecera X-Forwarded-For no autenticada

transfer.sh Go Report Card Docker pulls Build Status

Compartición de archivos fácil y rápida desde la línea de comandos. Este código contiene el servidor con todo lo necesario para crear tu propia instancia.

Transfer.sh actualmente es compatible con los proveedores s3 (Amazon S3), gdrive (Google Drive), storj (Storj) y el sistema de archivos local (local).




Descargo de responsabilidad

@stefanbenten resulta ser un mantenedor de este repositorio y la persona que aloja una conocida instalación pública del software en el repositorio. Sin embargo, ambos no están relacionados, y el repositorio no es el lugar para dirigir solicitudes o problemas relacionados con ninguna instalación pública. Ninguna instalación pública de terceros del software en el repositorio será anunciada ni mencionada en el propio repositorio, por razones de seguridad. La posición oficial de mí, @aspacca, como mantenedor del repositorio, es que si deseas usar el software, debes alojar tu propia instalación.




Uso

Esta sección describe cómo usar transfer.sh


Subir```bash

$ curl -v --upload-file ./hello.txt https://transfer.sh/hello.txt

root@kitploit:~
<br />

### Cifrar & Subir```bash
$ gpg --armor --symmetric --output - /tmp/hello.txt | curl --upload-file - https://transfer.sh/test.txt

Descargar y Descifrar```bash

$ curl https://transfer.sh/1lDau/test.txt | gpg --decrypt --output /tmp/hello.txt

root@kitploit:~
<br />

### Subir a Virustotal```bash
$ curl -X PUT --upload-file nhgbhhj https://transfer.sh/test.txt/virustotal

Eliminando```bash

$ curl -X DELETE

root@kitploit:~
<br />

---

<br />

## Encabezados de solicitud

Esta sección explica cómo manejar los encabezados de solicitud con curl:

<br />

### Max-Downloads```bash
$ curl --upload-file ./hello.txt https://transfer.sh/hello.txt -H "Max-Downloads: 1" # Limit the number of downloads

Max-Days```bash

$ curl --upload-file ./hello.txt https://transfer.sh/hello.txt -H "Max-Days: 1" # Set the number of days before deletion

root@kitploit:~
<br />

### X-Encrypt-Password

#### Cuidado, use esta función solo en su propio servidor autoalojado: confiar en un servicio de terceros para el cifrado del lado del servidor es bajo su propio riesgo.```bash
$ curl --upload-file ./hello.txt https://your-transfersh-instance.tld/hello.txt -H "X-Encrypt-Password: test" # Encrypt the content server side with AES256 using "test" as password

X-Decrypt-Password

Cuidado, use esta función solo en su servidor auto-alojado: confiar en un servicio de terceros para el cifrado del lado del servidor es bajo su propio riesgo```bash

$ curl https://your-transfersh-instance.tld/BAYh0/hello.txt -H "X-Decrypt-Password: test" # Decrypt the content server side with AES256 using "test" as password

root@kitploit:~
<br />

---

<br />

## Encabezados de Respuesta

Esta sección explica cómo manejar los encabezados de respuesta:

<br />

### X-Url-Delete

La URL utilizada para solicitar la eliminación de un archivo y devuelta como encabezado de respuesta:```bash
curl -sD - --upload-file ./hello.txt https://transfer.sh/hello.txt | grep -i -E 'transfer\.sh|x-url-delete'
x-url-delete: https://transfer.sh/hello.txt/BAYh0/hello.txt/PDw0NHPcqU
https://transfer.sh/hello.txt/BAYh0/hello.txt



Ejemplos

Véanse ejemplos de buen uso en examples.md


Aliases de enlace

Crear enlace de descarga directa:

https://transfer.sh/1lDau/test.txt --> https://transfer.sh/get/1lDau/test.txt

Archivo en línea:

https://transfer.sh/1lDau/test.txt --> https://transfer.sh/inline/1lDau/test.txt




Uso

Si desea usar TLS con certificados Let's Encrypt, establezca lets-encrypt-hosts en su dominio, configure tls-listener en :443 y habilite force-https.

Si desea usar TLS con sus propios certificados, configure tls-listener en :443, force-https, tls-cert-file y tls-private-key.




Desarrollo

Se cambió a GO111MODULE```bash go run main.go --provider=local --listener :8080 --temp-path=/tmp/ --basedir=/tmp/

root@kitploit:~
<br />

---

<br />

## Compilación```bash
$ git clone [email protected]:dutchcoders/transfer.sh.git
$ cd transfer.sh
$ go build -o transfersh main.go



Docker

Para una implementación sencilla, hemos creado un contenedor oficial de Docker. Hay dos variantes, que difieren solo en qué usuario ejecuta el proceso.

El predeterminado se ejecutará como root:

[!WARNING] Se desaconseja usar la etiqueta latest para WatchTower o herramientas similares. La etiqueta latest puede hacer referencia a versiones de desarrollo no publicadas, compilaciones de prueba y lanzamientos de parches para versiones anteriores. Use una etiqueta de versión real hasta que transfer.sh admita etiquetas de versión mayor o menor.```bash docker run --publish 8080:8080 dutchcoders/transfer.sh:latest --provider local --basedir /tmp/

root@kitploit:~
<br />

### Sin root

Las etiquetas `-noroot` indican compilaciones de imágenes que se ejecutan con mínimos privilegios para reducir la superficie de ataque en caso de que una aplicación se vea comprometida.

> [!NOTE]
> Se **recomienda** usar `-noroot`

<br />

La imagen etiquetada con el sufijo `-noroot` usará `5000` como UID y GID:```bash
docker run --publish 8080:8080 dutchcoders/transfer.sh:latest-noroot --provider local --basedir /tmp/

[!NOTE] Detalles del historial de desarrollo en:

  • https://github.com/dutchcoders/transfer.sh/pull/418

Tags


Construcción del Contenedor

También puedes construir el contenedor tú mismo. Esto te permite elegir qué UID/GID se usará, por ejemplo, al usar montajes NFS:```bash

Build arguments:

* RUNAS: If empty, the container will run as root.

Set this to anything to enable UID/GID selection.

* PUID: UID of the process. Needs RUNAS != "". Defaults to 5000.

* PGID: GID of the process. Needs RUNAS != "". Defaults to 5000.

docker build -t transfer.sh-noroot --build-arg RUNAS=doesntmatter --build-arg PUID=1337 --build-arg PGID=1338 .

root@kitploit:~
<br />

---

<br />

## Uso de S3

Para el uso con un bucket de AWS S3, solo necesitas especificar las siguientes opciones:
- provider `--provider s3`
- aws-access-key _(ya sea mediante flag o variable de entorno `AWS_ACCESS_KEY`)_
- aws-secret-key _(ya sea mediante flag o variable de entorno `AWS_SECRET_KEY`)_
- bucket _(ya sea mediante flag o variable de entorno `BUCKET`)_
- s3-region _(ya sea mediante flag o variable de entorno `S3_REGION`)_

Si especificas la s3-region, no necesitas establecer la URL del endpoint, ya que el endpoint correcto se usará automáticamente.

<br />

### Proveedores S3 personalizados

Para usar un proveedor S3 personalizado que no sea de AWS, debes especificar el endpoint según lo definido por tu proveedor de nube.

<br />

---

<br />

## Proveedor de Red Storj

Para usar la Red Storj como proveedor de almacenamiento, debes especificar los siguientes flags:
- provider `--provider storj`
- storj-access _(ya sea mediante flag o variable de entorno STORJ_ACCESS)_
- storj-bucket _(ya sea mediante flag o variable de entorno STORJ_BUCKET)_

<br />

### Crear Bucket y Scope

Debes crear un access grant (o copiarlo de la configuración de uplink) y un bucket como preparación.

Para comenzar, inicia sesión en tu cuenta y ve al Menú de Access Grant e inicia el Wizard en la esquina superior derecha.

Ingresa el nombre de access grant que prefieras, pulsa *Next* y restríngelo según sea necesario/preferido.

Después continúa ya sea en la CLI o dentro del navegador. A continuación, se te pedirá una frase de contraseña (Passphrase) utilizada como clave de cifrado.

**Asegúrate de guardarla en un lugar seguro. Sin ella, ¡perderás la capacidad de descifrar tus archivos!**

Después, puedes copiar el access grant y luego iniciar el endpoint de transfer.sh.
Se recomienda proporcionar tanto el access grant como el nombre del bucket como variables de entorno para mayor seguridad.

Ejemplo:```
export STORJ_BUCKET=<BUCKET NAME>
export STORJ_ACCESS=<ACCESS GRANT>
transfer.sh --provider storj



Uso de Google Drive

Para el uso con Google Drive, debes especificar las siguientes opciones:

  • provider
  • gdrive-client-json-filepath
  • gdrive-local-config-path
  • basedir

Creando el archivo JSON del cliente de Gdrive

Necesitas crear un ID de cliente OAuth desde console.cloud.google.com, descargar el archivo y colocarlo en un directorio seguro.


Ejemplo de usogo run main.go --provider gdrive --basedir /tmp/ --gdrive-client-json-filepath /[credential_dir] --gdrive-local-config-path [directory_to_save_config]




Shell functions

Bash, ash and zsh (multiple files uploaded as zip archive)

Add this to .bashrc or .zshrc or its equivalent
root@kitploit:~
transfer() (if [ $# -eq 0 ]; then printf "No se especificaron argumentos.\nUso:\n transfer <archivo|directorio>\n ... | transfer <nombre_archivo>\n">&2; return 1; fi; file_name=$(basename "$1"); if [ -t 0 ]; then file="$1"; if [ ! -e "$file" ]; then echo "$file: No existe el archivo o directorio">&2; return 1; fi; if [ -d "$file" ]; then cd "$file" || return 1; file_name="$file_name.zip"; set -- zip -r -q - .; else set -- cat "$file"; fi; else set -- cat; fi; url=$("$@" | curl --silent --show-error --progress-bar --upload-file "-" "https://transfer.sh/$file_name"); echo "$url"; )```

<br />

#### Now you can use transfer function

$ transfer hello.txt```


Bash and zsh (with delete url, delete token output and prompt before uploading)

Add this to .bashrc or .zshrc or its equivalent
Expand

root@kitploit:~
```bash
transfer()
{
    local file
    declare -a file_array
    file_array=("${@}")

    if [[ "${file_array[@]}" == "" || "${1}" == "--help" || "${1}" == "-h" ]]
    then
        echo "${0} - Subir archivos arbitrarios a \"transfer.sh\"."
        echo ""
        echo "Uso: ${0} [opciones] [<archivo>]..."
        echo ""
        echo "OPCIONES:"
        echo "  -h, --help"
        echo "      muestra este mensaje"
        echo ""
        echo "EJEMPLOS:"
        echo "  Subir un solo archivo desde el directorio de trabajo actual:"
        echo "      ${0} \"image.img\""
        echo ""
        echo "  Subir múltiples archivos desde el directorio de trabajo actual:"
        echo "      ${0} \"image.img\" \"image2.img\""
        echo ""
        echo "  Subir un archivo desde un directorio diferente:"
        echo "      ${0} \"/tmp/some_file\""
        echo ""
        echo "  Subir todos los archivos desde el directorio de trabajo actual. ¡Tenga en cuenta la limitación de velocidad del servidor web!:"
        echo "      ${0} *"
        echo ""
        echo "  Subir un solo archivo desde el directorio de trabajo actual y filtrar el token de eliminación y el enlace de descarga:"
        echo "      ${0} \"image.img\" | awk --field-separator=\": \" '/Delete token:/ { print \$2 } /Download link:/ { print \$2 }'"
        echo ""
        echo "  Mostrar texto de ayuda de \"transfer.sh\":"
        echo "      curl --request GET \"https://transfer.sh\""
        return 0
    else
        for file in "${file_array[@]}"
        do
            if [[ ! -f "${file}" ]]
            then
                echo -e "\e[01;31m'${file}' no se pudo encontrar o no es un archivo.\e[0m" >&2
                return 1
            fi
        done
        unset file
    fi

    local upload_files
    local curl_output
    local awk_output

    du -c -k -L "${file_array[@]}" >&2
    # ser compatible con "bash"
    if [[ "${ZSH_NAME}" == "zsh" ]]
    then
        read $'upload_files?\e[01;31m¿Realmente desea subir los archivos anteriores ('"${#file_array[@]}"$') a "transfer.sh"? (Y/n): \e[0m'
    elif [[ "${BASH}" == *"bash"* ]]
    then
        read -p $'\e[01;31m¿Realmente desea subir los archivos anteriores ('"${#file_array[@]}"$') a "transfer.sh"? (Y/n): \e[0m' upload_files
    fi

    case "${upload_files:-y}" in
        "y"|"Y")
            # para la barra de progreso, ejecutar "curl" para cada archivo.
            # los parámetros "--include" y "--form" suprimirán la barra de progreso.
            for file in "${file_array[@]}"
            do
                # mostrar el enlace de eliminación y filtrar el token de eliminación del encabezado de respuesta después de la subida.
                # es importante guardar la "stdout" de "curl" mediante una subcapa a una variable o redirigirla a otro comando,
                # que simplemente redirige a "stdout" para tener una salida coherente después.
                # la barra de progreso se redirige a "stderr" y solo se muestra,
                # si "stdout" está redirigido a algo; por ejemplo, ">/dev/null", "tee /dev/null" o "| <some_command>".
                # el encabezado de respuesta se redirige a "stdout", por lo que redirigir "stdout" a "/dev/null" no tiene sentido.
                # redirigir el "stderr" de "curl" a "stdout" ("2>&1") suprimirá la barra de progreso.
                curl_output=$(curl --request PUT --progress-bar --dump-header - --upload-file "${file}" "https://transfer.sh/")
                awk_output=$(awk \
                    'gsub("\r", "", $0) && tolower($1) ~ /x-url-delete/ \
                    {
                        delete_link=$2;
                        print "Delete command: curl --request DELETE " "\""delete_link"\"";

                        gsub(".*/", "", delete_link);
                        delete_token=delete_link;
                        print "Delete token: " delete_token;
                    }

                    END{
                        print "Download link: " $0;
                    }' <<< "${curl_output}")

                # devolver los resultados mediante "stdout", "awk" no hace esto por alguna razón.
                echo -e "${awk_output}\n"

                # evitar la limitación de velocidad tanto como sea posible; nginx: demasiadas solicitudes.
                if (( ${#file_array[@]} > 4 ))
                then
                    sleep 5
                fi
            done
            ;;

        "n"|"N")
            return 1
            ;;

        *)
            echo -e "\e[01;31mEntrada incorrecta: '${upload_files}'.\e[0m" >&2
            return 1
    esac
}

Sample output

root@kitploit:~
$ ls -lh
total 20M
-rw-r--r-- 1 <some_username> <some_username> 10M Apr  4 21:08 image.img
-rw-r--r-- 1 <some_username> <some_username> 10M Apr  4 21:08 image2.img
$ transfer image*
10240K  image2.img
10240K  image.img
20480K  total
¿Realmente deseas subir los archivos anteriores (2) a "transfer.sh"? (Y/n):
######################################################################################################################################################################################################################################## 100.0%
Comando de eliminación: curl --request DELETE "https://transfer.sh/wJw9pz/image2.img/mSctGx7pYCId"
Token de eliminación: mSctGx7pYCId
Enlace de descarga: https://transfer.sh/wJw9pz/image2.img

######################################################################################################################################################################################################################################## 100.0%
Comando de eliminación: curl --request DELETE "https://transfer.sh/ljJc5I/image.img/nw7qaoiKUwCU"
Token de eliminación: nw7qaoiKUwCU
Enlace de descarga: https://transfer.sh/ljJc5I/image.img

$ transfer "image.img" | awk --field-separator=": " '/Delete token:/ { print $2 } /Download link:/ { print $2 }'
10240K  image.img
10240K  total
¿Realmente deseas subir los archivos anteriores (1) a "transfer.sh"? (Y/n):
######################################################################################################################################################################################################################################## 100.0%
tauN5dE3fWJe
https://transfer.sh/MYkuqn/image.img```

<br />

---

<br />

## Contributions

Contributions are welcome.

<br />

---

<br />

## Creators

**Remco Verhoef**
- <https://twitter.com/remco_verhoef>
- <https://twitter.com/dutchcoders>

**Uvis Grinfelds**

<br />

---

<br />

## Maintainers

- **Andrea Spacca**
- **Stefan Benten**

<br />

---

<br />

## Copyright and License

Code and documentation copyright 2011-2018 Remco Verhoef.
Code and documentation copyright 2018-2020 Andrea Spacca.
Code and documentation copyright 2020- Andrea Spacca and Stefan Benten.

Code released under [the MIT license](https://github.com/dutchcoders/transfer.sh/blob/HEAD/LICENSE).
Descargar herramienta
ParámetroDescripciónValorEnv
listenerpuerto a usar para http (:80)LISTENER
profile-listenerpuerto a usar para el perfilador (:6060)PROFILE_LISTENER
force-httpsredirigir a httpsfalseFORCE_HTTPS
tls-listenerpuerto a usar para https (:443)TLS_LISTENER
tls-listener-onlybandera para habilitar solo el listener TLSTLS_LISTENER_ONLY
tls-cert-fileruta al certificado TLSTLS_CERT_FILE
tls-private-keyruta a la clave privada TLSTLS_PRIVATE_KEY
http-auth-userusuario para autenticación HTTP básica en la subidaHTTP_AUTH_USER
http-auth-passcontraseña para autenticación HTTP básica en la subidaHTTP_AUTH_PASS
http-auth-htpasswdruta del archivo htpasswd para autenticación HTTP básica en la subidaHTTP_AUTH_HTPASSWD
http-auth-ip-whitelistlista separada por comas de IPs permitidas para subir sin desafío de autenticaciónHTTP_AUTH_IP_WHITELIST
virustotal-keyclave de API de VirusTotalVIRUSTOTAL_KEY
ip-whitelistlista separada por comas de IPs permitidas para conectarse al servicioIP_WHITELIST
ip-blacklistlista separada por comas de IPs no permitidas para conectarse al servicioIP_BLACKLIST
temp-pathruta a la carpeta temporaltemp del sistemaTEMP_PATH
web-pathruta a los archivos web estáticos (para desarrollo o front-end personalizado)WEB_PATH
proxy-pathprefijo de ruta cuando el servicio está detrás de un proxy (se eliminará el prefijo /)PROXY_PATH
proxy-portpuerto del proxy cuando el servicio está detrás de un proxyPROXY_PORT
email-contactcontacto de correo electrónico para el front-endEMAIL_CONTACT
ga-keyclave de Google Analytics para el front-endGA_KEY
providerqué proveedor de almacenamiento usar(s3, storj, gdrive o local)
uservoice-keyclave de UserVoice para el front-endUSERVOICE_KEY
aws-access-keyclave de acceso AWSAWS_ACCESS_KEY
aws-secret-keyclave de acceso AWSAWS_SECRET_KEY
bucketbucket de AWSBUCKET
s3-endpointendpoint S3 personalizado.S3_ENDPOINT
s3-regionregión del bucket S3eu-west-1S3_REGION
s3-no-multipartdeshabilita la subida multiparte S3falseS3_NO_MULTIPART
s3-path-stylefuerza URLs de estilo ruta, necesario para Minio.falseS3_PATH_STYLE
storj-accessAcceso para el proyectoSTORJ_ACCESS
storj-bucketBucket a usar dentro del proyectoSTORJ_BUCKET
basedirruta de almacenamiento para el proveedor local/gdriveBASEDIR
gdrive-client-json-filepathruta al archivo JSON de configuración del cliente OAuth para el proveedor gdriveGDRIVE_CLIENT_JSON_FILEPATH
gdrive-local-config-pathruta para almacenar la caché de configuración local de transfer.sh para el proveedor gdriveGDRIVE_LOCAL_CONFIG_PATH
gdrive-chunk-sizetamaño de fragmento para subida a gdrive en megabytes, debe ser menor que la memoria disponible (8 MB)GDRIVE_CHUNK_SIZE
lets-encrypt-hostshosts a usar para los certificados Let's Encrypt (separados por comas)HOSTS
logruta al archivo de registroLOG
cors-domainslista separada por comas de dominios para CORS, al establecerlo se habilita CORSCORS_DOMAINS
clamav-hosthost para la función clamavCLAMAV_HOST
perform-clamav-prescanprescanear cada subida usando clamav (clamav-host debe ser un socket Unix local clamd)PERFORM_CLAMAV_PRESCAN
rate-limitsolicitudes por minutoRATE_LIMIT
max-upload-sizetamaño máximo de subida en kilobytesMAX_UPLOAD_SIZE
purge-daysnúmero de días después de los cuales las subidas se eliminan automáticamentePURGE_DAYS
purge-intervalintervalo (horas) para ejecutar la purga automática (excluye S3 y Storj)PURGE_INTERVAL
random-token-lengthlongitud del token aleatorio para la ruta de subida (el doble del tamaño para la ruta de eliminación)6RANDOM_TOKEN_LENGTH
NombreUso
latestÚltima compilación CI, puede ser nocturna, en commit, en tag, etc.
latest-norootÚltima compilación CI, puede ser nocturna, en commit, en tag, etc. usando [sin root]
nightlyCompilación CI programada cada medianoche UTC
nightly-norootCompilación CI programada cada medianoche UTC usando [sin root]
edgeÚltima compilación CI después de cada commit en main
edge-norootÚltima compilación CI después de cada commit en main usando [sin root]
vx.y.zCompilación CI después de etiquetar un lanzamiento
vx.y.z-norootCompilación CI después de etiquetar un lanzamiento usando [sin root]