De plus en plus de chall de CTF ou de box sur HTB nécessitent d’effectuer du port forwarding (ou si vous préférez de créer un tunnel SSH). Vu que je n’y comprenais pas grand chose au début, j’ai un peu creusé le sujet histoire de m’endormir moins bête :)
Je vous propose de découvrir dans cet article un condensé des infos pertinentes sur les tunnels SSH, à savoir les concepts et les commandes essentielles pour effectuer du SSH port forwarding.
Port forwarding, késako?
Le tunneling SSH ou SSH port forwarding est une méthode permettant de créer une connexion SSH chiffrée entre un client et un serveur par lequel les ports peuvent être relayés.
La redirection SSH est utile pour transporter des données de services qui utilisent un protocole non chiffré, comme VNC ou FTP, pour accéder à des contenus géo-limités, ou pour contourner des pare-feux intermédiaires. Les tunnels SSH sont également utilisés pour installer des backdoors dans des réseaux internes.
En principe, nous pouvons transférer n’importe quel port TCP et faire transiter le trafic par une connexion SSH sécurisée.
Il existe trois types de redirection de port SSH :
- Redirection de port local. - Transfère une connexion de l’hôte client vers l’hôte du serveur SSH, puis vers le port hôte de destination.
- Redirection de port à distance. - Transfère un port de l’hôte serveur à l’hôte client et ensuite au port de l’hôte de destination.
- Redirection dynamique de port. - Crée un serveur proxy SOCKS qui permet la communication sur une série de ports.
Nous nous intéresserons ici aux deux premiers types de redirection: Local port forwarding et Remote port forwarding.
Pour effectuer ces types de redirection de port, nous pouvons utiliser plusieurs outils dont OpenSSH (machine Linux), plink.exe (machine Windows) et Chisel (multi OS). Il est aussi possible d’utiliser PuTTY à la place de plink en environnement Windows (voir par exemple l’article de LinuxSize en référence)
Plink.exe est téléchargeable ici: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
Utiliser la bonne version (32 ou 64 bits) de plink en fonction du type de machine. Pour obtenir l’architecture: C:\>wmic os get osarchitecture
ou systeminfo
Chisel (server) est disponible ici: https://github.com/jpillora/chisel
Les derniers fichiers ‘client’ de Chisel sont ici: https://github.com/jpillora/chisel/releases/tag/v1.7.2
‘Chisel is a fast TCP tunnel, transported over HTTP, secured via SSH. Single executable including both client and server. Written in Go (golang). Chisel is mainly useful for passing through firewalls, though it can also be used to provide a secure endpoint into your network. Chisel is very similar to crowbar though achieves much higher performance.’
Installation de Chisel:
git clone https://github.com/jpillora/chisel.git
- Dans le répertoire de chisel:
go build
Avant d’entrer dans le vif du sujet, soulignons qu’un autre outil est intéressant pour faire du port forwarding. Il s’agit de Ngrock. Découvrez comment utiliser Ngrock ici
1 - Local port forwarding
La redirection de port local vous permet de transférer un port de la machine locale (client ssh) vers un port de la machine distante (serveur ssh), qui est ensuite transféré vers un port de la machine de destination.
Dans ce type de redirection, le client SSH écoute les connexions sur un port configuré, et lorsqu’il reçoit une connexion, il la tunnelise vers un serveur SSH. Le serveur se connecte à un port de destination configuré, éventuellement sur une autre machine que le serveur SSH.
Commandes:
OpenSSH:
-L # Forwarder un port local vers un port distant sur une machine distante
ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
Il est possible d’utiliser tout n’importe quel port supérieur à 1024 comme LOCAL_PORT. Les numéros de port inférieurs à 1024 sont des ports privilégiés et ne peuvent être utilisés que par l’utilisateur privilégié root. Si votre serveur SSH écoute sur un port autre que 22 (par défaut), utilisez l’option -p [PORT_NUMBER].
plink:
C:\>plink32.exe -ssh -l USERNAME -pw MYPASSWORD -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT SSH_SERVER
ou
C:\>plink.exe -ssh USER@SSH_SERVER -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT
Chisel:
Sur la machine pivot:
chisel server -p PORT --host SERVER_SSH -v
Sur la machine d’attaque:
chisel client -v SERVER_SSH:PORT [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT
2 - Remote port forwarding
La redirection de port à distance est l’opposé de la redirection de port local. Elle permet de transférer un port de la machine distante (serveur ssh) vers un port de la machine locale (client ssh), qui est ensuite transféré vers un port de la machine de destination.
Dans ce type de transfert, le serveur SSH écoute sur un port donné et tunnelise toute connexion à ce port vers le port spécifié sur le client SSH local, qui se connecte ensuite à un port sur la machine de destination. La machine de destination peut être la machine locale ou toute autre machine.
Commandes:
OpenSSH:
-R # Forwarder un port distant vers un port local sur la machine locale
ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
plink:
C:\>plink32.exe -ssh -l USERNAME -pw MYPASSWORD -R [REMOTE]:REMOTE_PORT:DESTINATION:DESTINATION_PORT SSH_SERVER
ou
C:\>plink.exe -ssh USER@SSH_SERVER -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT
Chisel:
Sur la machine d’attaque:
chisel server -p PORT [--host HOST_IP] --reverse -v
Sur la machine pivot:
chisel client -v HOST_IP:PORT R:[REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT
En résumé:
Happy Hacking !
Références:
1 - OpenSSH
- How to setup ssh tunneling - Linuxsize
- OSCP - Understanding ssh tunnels - FalconSpy
- SSH Port forwarding examples
- Comprendre la redirection de port (Port forwarding) - Linux France
2 - Plink
- Using the command-line connexion tool plink
- Tunneling sessions via plink - Booches.nl
- Setting up an ssh tunnel using plink
- Remote SSH tunneling with plink.exe
3 - Chisel
- Tunneling with Chisel and SSF - 0xdf
- Etat de l’art du pivoting réseau en 2019 - Orange CYberdefense
Credit photos:
Poursuivez avec :
- Oneliner shell - Cheat sheet
- Over The Wire - Bandit 3 - SSH Part
- Redirection de port avec Ngrock
This work is licensed under a Creative Commons Attribution 4.0 International License.