Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
ndhquals2015:secureauth [2015/04/05 14:35] Spl3en créée |
ndhquals2015:secureauth [2017/04/09 15:33] (Version actuelle) |
||
---|---|---|---|
Ligne 84: | Ligne 84: | ||
http://download.redis.io/redis-stable/src/networking.c | http://download.redis.io/redis-stable/src/networking.c | ||
- | En remplaçant l'username par ''admin\x0A\x0D'', on obtient : | + | En remplaçant l'username par ''admin\x0A\x0D'' afin d'essayer de terminer la commande, on obtient : |
spl3en@box:~$ python SecureAuthClient.py | spl3en@box:~$ python SecureAuthClient.py | ||
Ligne 95: | Ligne 95: | ||
[-] Bad password or authentification error... ! | [-] Bad password or authentification error... ! | ||
- | On note au passage le préfixe '':name''. | + | On note au passage le préfixe '':name'' qui a tenté d'être interprêté comme une deuxième commande. |
- | En essayant d'injecter des commandes, par exemple ''INFO'' en mettant dans l'username la valeur ''admin\x0A\x0DINFO\x0A\x0D'', le serveur nous renvoie : | + | En essayant d'injecter des commandes (http://redis.io/commands), par exemple ''INFO'' en mettant dans l'username la valeur ''admin\x0A\x0DINFO\x0A\x0D'', le serveur nous renvoie : |
spl3en@box:~$ python SecureAuthClient.py | spl3en@box:~$ python SecureAuthClient.py | ||
Ligne 109: | Ligne 109: | ||
[-] Bad password or authentification error... ! | [-] Bad password or authentification error... ! | ||
- | Un grand nombre de commandes sont filtrées, mis à part la commande ''GET'', ce qui nous laisse supposer qu'elle est utilisée pour récupérer le username et password dans la base NoSQL. | + | La commande INFO n'est pas reconnue, et après de nombres tests, on remarque qu'un grand nombre de commandes sont filtrées, mis à part la commande ''GET''. |
+ | |||
+ | On suppose donc qu'elle est utilisée pour récupérer le username et password dans la base NoSQL. | ||
Avec un peu d'imagination, on tente de recréer les requêtes qui sont faites pour récupérer le login et mot de passe côté serveur : | Avec un peu d'imagination, on tente de recréer les requêtes qui sont faites pour récupérer le login et mot de passe côté serveur : | ||
Ligne 118: | Ligne 120: | ||
On essaye donc d'injecter ''admin:password\x0A\x0D'' dans l'username, ce qui nous donne : | On essaye donc d'injecter ''admin:password\x0A\x0D'' dans l'username, ce qui nous donne : | ||
- | username = GET admin:password\x0A\x0D:name | + | username = GET admin:password\x0A\x0D:name (le :name n'est pas interprêté) |
- | password = GET admin:password\x0A\x0D:password | + | password = GET admin:password\x0A\x0D:password (le :password n'est pas interprêté) |
Le serveur nous renvoie : | Le serveur nous renvoie : | ||
Ligne 134: | Ligne 136: | ||
Comme attendu, le serveur affiche l'username que nous avons remplacé par son password. Nous obtenons donc le ''sha256(admin_password)'' qui est ''837a135ad3ccb1978f169aa62a62a028b76ec42b2284791bd4703421ec050529''. | Comme attendu, le serveur affiche l'username que nous avons remplacé par son password. Nous obtenons donc le ''sha256(admin_password)'' qui est ''837a135ad3ccb1978f169aa62a62a028b76ec42b2284791bd4703421ec050529''. | ||
- | Pour rappel, le packet contenant le password est formé ainsi : | + | Pour rappel, le packet envoyé au serveur contenant le password est formé ainsi : |
packet = "AUTH %s|%s" % (username, sha256(sha256(authtoken).hexdigest() + challenge).hexdigest()) | packet = "AUTH %s|%s" % (username, sha256(sha256(authtoken).hexdigest() + challenge).hexdigest()) |