Redirections de ports avec SSH

Table des matières :

Introduction

Pendant les pentest, en ctf, ou simplement pour de l’administration système, nous pouvons avoir besoin d’accéder à des ports sur des machines distantes ou des réseaux distants.

Pour ce faire, nous utilisons une technique appellée “redirection de ports” permettant d’accéder à des ports inaccessibles jusque là. Cette technique peut notemment être utile pour accéder à des services qui tournent localement sur le serveur (qui écoutent sur 127.0.0.1) de manière sécurisée sans ouvrir de ports à l’extérieur de la machine. Dans cet article, nous allons nous intéresser aux redirections de ports avec SSH.

Redirections de ports avec SSH

Pour bien comprendre dans quel sens se font les redirections SSH, il suffit de se placer du point de vue du client depuis lequel on se connecte en SSH. Nous avons donc :

  • Redirection locale : redirection vers le client d’un port donné sur le serveur auquel on se connecte en SSH. On utilise ce type de redirection lorsque l’on veut accéder à un port présent sur le serveur de la connexion SSH auquel on se connecte, mais auquel nous ne pouvons pas accéder (à cause d’un firewall, d’un listen sur 127.0.0.1, …).

  • Redirection distante : redirection vers le serveur de la connection SSH d’un port du client SSH ou d’une machine distante. On utilise ce type de redirection pour exposer un port de la machine cliente sur le serveur distant. (Pour accéder à plusieurs ports/machines du réseau distant, il est préférable d’utiliser la redirection de port dynamique)

Nous allons voir dans les sections suivantes des exemples de différents types de redirections, basés sur ce réseau de test :

Dans ce réseau, la machine 192.168.1.1 et son port SSH 22 du réseau CORP sont accessibles publiquement sur le nom de domaine remote.corp.com.

Redirection de port local

La redirection de port local permet à une machine cliente d’accéder à un port ouvert sur le serveur de la connexion SSH, ou à un port d’une machine que le serveur SSH peut contacter sur le réseau. Pour effectuer une redirection de port local, la syntaxe de la commande SSH est la suivante :

ssh -L [bind_address:]my_local_port:destination_ip:remoteserver_local_port user@remoteserver

Voici le détail des options de cette commande :

  • -L : Spécifie une redirection de port local, cette option attend un chemin de redirection, que nous verrons juste après.

  • [bind_address:]my_local_port:destination_ip:remoteserver_local_port : C’est le chemin de redirection. Il spécifie le port local à ouvrir sur la machine cliente de la connexion SSH, ainsi que l’IP et le port distant à rediriger. Il est possible de spécifier sur quelle adresse locale sur la machine cliente le port sera ouvert (c’est la bind_address). Par défaut cette adresse est l’adresse locale 127.0.0.1. Il est également possible de se connecter à des machines appartenant au réseau du serveur SSH en spécifiant l’IP de la machine dans le champ destination_ip ce cette option.

  • user@remoteserver : Cet élément correspond à l’utilisateur et au serveur distant avec lesquels la connexion SSH sera établie.

Voyons un exemple pratique de redirection de port locale dans notre réseau de test :

Exemple 1

Dans cet exemple nous allons effectuer une redirection du port local 8000 de la machine 192.168.1.1 vers le port 1234 de notre machine via SSH. La commande est donc la suivante :

ssh -L 1234:127.0.0.1:8000 user@192.168.1.1
  • Etape 1 : La première étape est la phase d’établissement de connexion SSH au serveur distant. C’est à ce moment que le tunnel SSH est établi :

  • Etape 2 : Lorsque la phase d’établissement de connexion SSH est finie, le tunnel est en place et prêt à traiter les options de redirections de ports :

  • Etape 3 : Les redirections de port sont mises en place. Ici le port 8000 de la machine distante (le serveur SSH) est redirigé vers le port 1234 sur la machine cliente de la connexion SSH :

Redirection de port distant

La redirection de port distant permet à une machine cliente d’une connexion SSH de rediriger un de ses ports vers un port du serveur, ou de rediriger un port d’une machine du réseau du serveur SSH sur un port local au serveur. Cela peut être utile pour accéder à des services qui tournent sur des machines du réseau du serveur de manière sécurisée sans ouvrir de ports accessibles à l’extérieur du réseau.

Pour effectuer une redirection de port distant, la syntaxe de la commande SSH est la suivante :

ssh -R [bind_address:]my_local_port:remote_ip:remoteserver_local_port user@remoteserver

Voici le détail des options de cette commande :

  • -R : Spécifie une redirection de port distant, cette option attend un chemin de redirection, que nous verrons juste après.

  • [bind_address:]my_local_port:remote_ip:remoteserver_local_port : C’est le chemin de redirection. Il spécifie le port local à ouvrir sur le serveur de la connexion SSH, ainsi que l’ip et le port distant à rediriger. Il est également possible de spécifier sur quelle adresse locale du serveur le port sera ouvert (c’est la bind_address). Par défaut cette adresse est 127.0.0.1.

  • user@remoteserver : Cet élément correspond à l’utilisateur et au serveur distant avec lesquels la connexion SSH sera établie.

Voyons un exemple pratique de redirection de port distant dans notre réseau de test :

Exemple 2

Dans cet exemple nous allons effectuer une redirection du port distant 8000 de la machine 192.168.1.2 sur le port local 1234 du serveur 192.168.1.2 via SSH.

ssh -R 1234:127.0.0.1:8000 user@192.168.1.1
  • Etape 1 : La première étape est la phase d’établissement de connexion SSH au serveur distant. C’est à ce moment que le tunnel SSH est établi :

  • Etape 2 : Lorsque la phase d’établissement de connexion SSH est finie, le tunnel est en place et prêt à traiter les options de redirections de ports :

  • Etape 3 : Les redirections de port sont mises en place. Ici le port 8000 de la machine cliente de la connexion SSH est redirigé vers le port 1234 du serveur de la connexion SSH :

Exemple 3

Voici un autre exemple permettant de rediriger le port 8000 de la machine 192.168.1.2 au port 1234 du serveur de la connexion SSH:

ssh -R 192.168.1.1:1234:192.168.1.2:8000 user@192.168.1.1
  • Etape 1 : La première étape est la phase d’établissement de connexion SSH au serveur distant. C’est à ce moment que le tunnel SSH est établi :

  • Etape 2 : Lorsque la phase d’établissement de connexion SSH est finie, le tunnel est en place et prêt à traiter les options de redirections de ports :

  • Etape 3 : Les redirections de port sont mises en place. Ici le port 8000 de la machine distante appartenant au réseau du serveur est redirigé vers le port 1234 sur le serveur de la connexion SSH :

Redirection de port dynamique

Grâce à la commande ssh il est également possible d’effectuer des redirections de ports dynamiques. Pour ce faire, lors d’une connexion SSH paramétrée pour effectuer ce type de redirections, un port est ouvert sur la machine cliente de la connexion SSH pour héberger un proxy SOCKS. Ensuite, nous pouvons utiliser ce proxy pour se connecter à des ports de la machine distante (ou accessibles sur son réseau).

Pour initier une redirection de port dynamique, il faut utiliser la commande ssh avec l’argument -D suivi du port local qui hébergera le proxy SOCKS sur votre machine client:

ssh -D local_port user@remoteserver

Exemple 3

La commande suivante permet de se connecter en SSH à la machine distante remote.corp.com (192.168.1.1) puis de lancer un proxy SOCKS sur votre machine locale sur le port 8080:

ssh -D 8080 user@remote.corp.com
  • Etape 1 : La première étape est la phase d’établissement de connexion SSH au serveur distant. C’est à ce moment que le tunnel SSH est établi :

  • Etape 2 : Lorsque la phase d’établissement de connexion SSH est finie, le tunnel est en place et prêt à traiter les options de redirections de ports :

  • Etape 3 : Les redirections de port sont mises en place. Ici un proxy SOCKS est ouvert sur le port 8080 de la machine cliente de la connexion SSH. Ce proxy permet de faire des requêtes sur n’importe quelle machine / ports appartenant au réseau du serveur distant :

Ensuite, nous pouvons utiliser ce proxy dans divers outils pour accéder au réseau interne distant de CORP.

References