> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/os/linux.md).

# Linux

```
# version du kernel
uname -r
```

## Système de fichiers

### Arborescence

* **/etc:** fichiers de configuration
* **/bin:** binaires compilés
* **/sbin:** binaires systèmes
* **/home:** contient un dossier pour chaque utilisateur. Il contient entre autres les sous dossiers:

### Permissions

Chaque fichier a des permissions spécifiques pour:

* son propriétaire
* son groupe (un groupe d'utilisateurs)
* tous les autres utilisateurs

Chacun peut avoir 3 niveaux de permissions:

* **lecture:** lire son contenu
* **écriture:** modifier son contenu
* **exécution**

{% hint style="info" %}
La permissions `x` sur un dossier ne veut pas dire exécution mais **"droit d'accès"**.

-> possible d'exécuter la commande: `cd dossier`
{% endhint %}

**Modifier les permission d'un fichier**

```bash
# avec les chiffres
chmod xyz <fichier>
# permissions
# x: propriétaire
# y: groupe
# z: autres utilisateurs

# avec les lettres
chmod +rw <fichier>

# avec u,g et o (user, group et other)
chmod u=rw,g=r,o= <fichier>
```

{% tabs %}
{% tab title="Exec" %}

```
chmod 111 <fichier>
```

{% endtab %}

{% tab title="Write" %}

```
chmod 222 <fichier>
```

{% endtab %}

{% tab title="Write + Exec" %}

```
chmod 333 <fichier>
```

{% endtab %}

{% tab title="Read" %}

```
chmod 444 <fichier>
```

{% endtab %}

{% tab title="Read + Exec" %}

```
chmod 555 <fichier>
```

{% endtab %}

{% tab title="Read + Write" %}

```
chmod 666 <fichier>
```

{% endtab %}

{% tab title="Read + Write + Exec" %}

```
chmod 777 <fichier>
```

{% endtab %}
{% endtabs %}

**Modifier le propriétaire d'un fichier**

```
chown <user> <fichier>
```

## Utilisateurs

La liste des utilisateurs est dans **/etc/passwd**.

```atom
username:password:userID:groupID:gecos:homeDirectory:shell
```

{% tabs %}
{% tab title="username" %}
Nom d'utilisateur.
{% endtab %}

{% tab title="password" %}
Mot de passe. Un **x indique que un hash du mot de passe est stocké dans /etc/shadow**.
{% endtab %}

{% tab title="userID" %}
Identifiant de l'utilisateur. L'UID 0 est réservé à root.
{% endtab %}

{% tab title="groupID" %}
Identifiant du groupe principal de l'utilisateur (voir /etc/group).
{% endtab %}

{% tab title="gecos" %}
Commentaire décrivant l'utilisateur.
{% endtab %}

{% tab title="home" %}
Chemin vers le dossier **home** de l'utilisateur. Il se situe dans ce dossier quand il se connecte.

S'il n'en a pas, le répertoire de base de l'invité est utilisé.
{% endtab %}

{% tab title="shell" %}
Interpréteur de commande appelée lors d'une connexion (/usr/bin/sh par défaut).
{% endtab %}
{% endtabs %}

**Changer le mot de passe**

```
sudo passwd <user>
```

## IPC

**Socket**

Les droits sur un socket sont différentes de ceux sur un fichier normal.

|      Droit      | Fichier normal             | Socket Unix                                                                                                                                                    |
| :-------------: | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|   **r (read)**  | Lire le contenu du fichier | Permet **de vérifier l’existence du socket**, et dans certains cas **de lister ou d’interroger ses métadonnées** (mais **pas** de lire les données échangées). |
|  **w (write)**  | Écrire dans le fichier     | Permet **d’établir une connexion** au socket et d’envoyer/recevoir des données. **C’est le vrai accès utile.**                                                 |
| **x (execute)** | Exécuter un programme      | Permet **d’entrer dans le répertoire** qui contient le socket ou d’effectuer des opérations de type “connect” dans certains cas (souvent redondant avec `w`).  |

## Signaux

{% embed url="<https://www.linuxtricks.fr/wiki/signaux-unix-unix-signals>" %}

## Table des appels systèmes (arm, arm64, x86, x64)

{% embed url="<https://x64.syscall.sh/>" %}

## Services

Un fichier de configuration `.service` défini la commande à exécuter, des paramètres de sécurité, etc.

**Interagir avec un service**

```
sudo systemctl stop|start|restart|status|enable|disable <service>
```

{% hint style="success" %}

* `disable` n'arrête pas le service mais empêche son lancement au démarrage du système (il peut être démarré ou arrêté manuellement)
* `enable` fait l'inverse
  {% endhint %}

**Prendre en compte une modification du fichier de service**

```
sudo systemctl daemon-reload
```

**Analyser le niveau de sécurité d'un service**

```
sudo systemd-analyze security <service>
```

## Variables d'environnement

**Modifier une variable d'environnement**

```
export VARIABLE=<valeur>
```

**Voir les variables d'environnement**

```
env
```

**PATH**

Quand une commande est exécutée le système cherche dans le `PATH` (dans l'ordre d'apparition des dossiers) un fichier du même nom et exécute le premier qu'il trouve.

```
$ cat
# le système cherche dans les dossiers de PATH un fichier nommé cat
```

**Modifier le PATH**

```
export PATH=$PATH:<nouveau dossier>
```

{% hint style="success" %}
Pour ajouter un dossier qui sera vérifié avant les autres il faut bien l'ajouter avant:

```
export PATH=<nouveau dossier>:$PATH
```

{% endhint %}

## Tips

**Voir les permissions sudo attribuées à l'utilisateur courant**

```
$ sudo -l
[...]
User user may run the following commands on this host:
   (user) /bin/cat /home/user/conf.txt
   (other_user) /bin/cat /home/other_user/conf.txt
   
# Exécuter la commande en tant que l'autre utilisateur
$ sudo -u other_user /bin/cat /home/other_user/conf.txt
```

**Chercher un fichier par nom depuis la racine**

```
find / -name <nom>
```

**Chercher les occurrences d'un pattern dans les documents depuis la racine**

```
grep -r "<pattern>" /
```

**Historique des commandes**

`CTRL + R:` chercher une commande avec mots clés

```sh
(reverse-i-search)`':
```

**Lien symbolique**

```
ln -s target link
```

**Modifier argv\[0] pour un programme**

```
exec -a nouveau_nom ./prog
```

{% hint style="success" %}
Si ça ne fonctionne pas essayer :

```
( exec -a "nouveau_nom" ./prog )
```

{% endhint %}

{% hint style="danger" %}
Si un programme se relance avec `exec*(argv[0], argv)` on peut utiliser ça pour qu'il exécute un autre programme.
{% endhint %}
