Les buckets s3 c'est comme les FTP free

Posted on Wed 28 August 2019 in Non classé

En surfant sur les internets je suis malencontreusement tombé sur un bucket Amazon S3 utilisé par un site que je consultais.

Le problème avec ce service proposé par Amazon c'est qu'il est insécurisé par défaut : https://www.upguard.com/blog/s3-security-is-flawed-by-design .

\<salt>Pour caricaturer , auparavant les développeurs web crados y allaient à grand coup de chmod 777 à tout va sur le FTP, désormais on fout tout dans un bucket s3 et on l'ouvre en public. \</salt>

Un bucket s3 ouvert en public = tout le bucket accessible à tout va et à n'importe qui. En fouillant dans ce seau, je suis tombé sur des dump de la base SQL de production (oh bah merde alors).

Cela m'a permis d'apprendre à jouer avec les buckets, si jamais vous tombez sur une instance ouverte un jour, voici un script python qui permet dumper la liste de touts les objets présents (remplacer "bucket-tout-moisi") :

#!/usr/bin/python3
import boto3
import json
from botocore import UNSIGNED
from botocore.client import Config

client = boto3.client("s3", config=Config(signature_version=UNSIGNED))

paginator = client.get_paginator("list_objects_v2")

data = []
for page in paginator.paginate(Bucket="bucket-tout-moisi"):
    for elem in page["Contents"]:
        data.append(elem["Key"])

with open('output.json', 'w') as outfile:
    json.dump(data, outfile)

On creuse et on trouve que ce dump SQL est une base PostgreSQL. Si vous êtes sous Win10, je vous conseille d'installer un sous-système Linux (debian-wsl) + VcXsrv + Terminator puis d'installer postgresql, ça va vite, on importe le dump puis avez un outil simple comme PgAdmin on regarde ce qu'il y'a de beau à gratter.

Oh surprise, cette base contient 2600+ utilisateurs, hash de mot de passe, adresses, des données personnelles, etc,etc.

La table "users" est intéressante elle contient des hashs de mot de passe au format bcrypt, c'est à dire un sel différent pour chaque utilisateur + hash du mot de passe :

$2y$10$wxeXGxk6YJTN8MPXFAeoLewBJ6toW88x.xqiNq7c/Ip0Y8MYhD0DO

C'est pas mal du tout puisque ça permet en cas de fuite de la base de données d'éviter des attaques par table arc-en-ciel.

On peut quand même retrouver quelques mots de passe en utilisant Hashcatet un dictionnaire de mots de passe, en l’occurrence c'est un site français donc j'ai pris la liste des 5000 mots de passe Français les plus fréquents dans le projet Richelieu : https://github.com/tarraschk/richelieu

PS : si un de vos mot de passe est dans cette liste, bon, voilà hein.

Hashcat demande énormément de puissance de calcul puisque pour chaque sel et chaque élément du dictionnaire il va calculer le hash de mot de passe correspondant puis comparer avec tous les hashs de mots de passes de la liste. Temps estimé avec une GTX 1080 : 13h.

En laissant tourner quelques minutes, j'ai pu trouver 18 mots de passes simples.

En corrélant les résultat avec la liste des emails on obtient une liste comme celle-ci :

xxxxxxxxxxxxxxxxxx@wanadoo.fr:$2y$10$wxeXGxk6YJTN8MPXFAeoLewBJ6toW88x.xqiNq7c/Ip0Y8MYhD0DO:toto
xxxxxxxxxxxxxxxxxx@free.fr:$2y$10$wxeXGxk6YJTN8MPXFAeoLewBJ6toW88x.xqiNq7c/Ip0Y8MYhD0DO:motdepasse
xxxxxxxxxxxxxxxxxx@gmail.com:$2y$10$wxeXGxk6YJTN8MPXFAeoLewBJ6toW88x.xqiNq7c/Ip0Y8MYhD0DO:pierre
xxxxxxxxxxxxxxxxxx@numericable.fr:$2y$10$wxeXGxk6YJTN8MPXFAeoLewBJ6toW88x.xqiNq7c/Ip0Y8MYhD0DO:dodo
xxxxxxxxxxxxxxxxxx@laposte.net:$2y$10$wxeXGxk6YJTN8MPXFAeoLewBJ6toW88x.xqiNq7c/Ip0Y8MYhD0DO:coucou
xxxxxxxxxxxxxxxxxx@sfr.fr:$2y$10$wxeXGxk6YJTN8MPXFAeoLewBJ6toW88x.xqiNq7c/Ip0Y8MYhD0DO:password
etc...

Les combinaisons email+mot de passe sont très intéressantes puisqu'en général les gens sont fainéants et réutilisent le même mot de passe partout, donc il y'a fort à parier qu'on puisse se connecter avec les email/mot de passe à divers comptes Facebook/Mail/Twitter/etc

Après avoir gratté et appris à faire joujou avec Hashcat et les buckets s3 j'ai pris contact avec l'éditeur du site en défaut qui à depuis pris les mesures nécessaires pour faire le ménage.