
Déterminer les privilèges à partir d'identifiants cloud via des tests par force brute.
J'ai des identifiants, et maintenant ?
CloudPrivs est un outil qui exploite la puissance existante des SDK comme Boto3 pour forcer les privilèges de tous les services cloud afin de déterminer quels privilèges existent pour un ensemble donné d'identifiants.
Cet outil est utile pour les pentesteurs, les red teamers et autres professionnels de la sécurité. Les services cloud ne proposent généralement aucun moyen de déterminer les autorisations associées à un ensemble d'identifiants, et le nombre considérable de services et d'opérations rend la vérification manuelle fastidieuse. Cela signifie qu'une escalade de privilèges pourrait être possible à partir d'un ensemble d'identifiants, mais que l'on ne le saurait jamais simplement parce qu'on ignore que les identifiants AWS trouvés peuvent exécuter Lambda.
Pas encore disponible sur PyPi mais je travaille dessus
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m pip install -e .
Ceci est sans environnement virtuel et déconseillé si vous exécutez de nombreux programmes Python.
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m venv venv/
./venv/bin/activate # activate.ps1 sur Windows
python -m pip install -e .
Vous pouvez aussi utiliser Pyenv+virtualenv si disponible :
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
pyenv virtualenv CloudPrivs
pyenv local CloudPrivs
python -m pip install -e .
cloudprivs [PROVIDER] [ARGS]
Actuellement, le seul fournisseur disponible est AWS, mais je travaille sur GCP. Si vous souhaitez aider, voir #Personnalisation.
Options :
-v, --verbose Afficher les tests échoués et en erreur dans la sortie
-s, --services TEXTE Tester uniquement les services donnés au lieu de tous les services disponibles
-p, --profile TEXTE Nom du profil AWS à analyser ; s'il n'est pas spécifié, les variables d'environnement seront utilisées
-t, --custom-tests NOMFICHIER Emplacement du fichier YAML de tests personnalisés. Lire la documentation pour plus d'informations
-r, --regions TEXTE Liste de filtres à appliquer aux régions, ex. "us", "eu-west", "ap-north-1"
--help Afficher ce message et quitter.
Plusieurs arguments sont acceptés pour --region et --service, mais ils doivent être fournis à chaque fois avec le drapeau, ex. cloudprivs aws -r us -r eu -s ec2 -s lambda. Je n'aime pas ça non plus, mais c'est une limitation de Click pour laquelle je n'ai pas encore trouvé de solution.
Notez que le drapeau
regionaccepte les correspondances partielles ; les arguments les plus courants sont-r us -r eupour ne couvrir que les régions communes.
Les résultats sont affichés regroupés par région et chaque ligne contient un cas de test et le résultat du test.
Si l'outil rencontre des erreurs inattendues lors des tests, elles sont émises sur stderr au fur et à mesure, ce qui peut interrompre le flux de sortie. Si vous ne voulez pas les voir, vous pouvez rediriger stderr.
Contrairement à d'autres outils comme WeirdAAL qui écrivent chaque cas de test à la main, CloudPrivs interroge directement le SDK Boto3 pour générer dynamiquement une liste de tous les services disponibles et de toutes les régions disponibles pour chaque service.
Une fois la liste complète générée, chaque fonction est appelée sans arguments par défaut, bien qu'il soit possible d'ajouter des arguments personnalisés par opération (plus d'informations dans #Personnalisation).
Note : certaines fonctions AWS peuvent engendrer des coûts lorsqu'elles sont appelées. Je n'ai autorisé que les opérations commençant par
get_,list_etdescribe_pour limiter les coûts accidentels, ce qui semble sûr dans mes propres tests, mais veuillez utiliser cet outil avec prudence. Cela semble sûr pour d'autres outils comme enumerate-iam. Je ne garantis pas que vous n'engendrerez pas accidentellement des coûts en appelant toutes ces fonctions (même sans arguments).
CloudPrivs prend en charge une extension/personnalisation facile dans deux domaines :
Implémenter un nouveau fournisseur (ex. GCP) est simple :
CloudPrivs/providers, créez un nouveau dossier pour votre fournisseur (ex. 'gcp').CloudPrivs/providers/__init__.py, ajoutez votre fournisseur à la variable __all__, elle doit correspondre au nom du dossier.cli.py dans votre dossier fournisseur.cli (voir le fournisseur AWS pour référence).cloudprivs <provider> devrait maintenant afficher votre CLI.Le fournisseur AWS prend en charge l'injection d'arguments lors de l'appel des fonctions AWS. Cette fonctionnalité est fournie car souvent une fonction AWS nécessite des arguments pour être appelée et, dans certains cas, ces arguments peuvent être des variables fixes. Ainsi, si nous pouvons fournir des variables fictives, nous pouvons augmenter notre couverture de test. Dans d'autres cas, nous pouvons injecter des arguments comme dryrun=true pour accélérer les appels.
Les tests personnalisés sont stockés dans un fichier YAML à cloudprivs/providers/aws/CustomTests.yaml.
La structure du YAML est la suivante :
---
<nom-du-service>:
- <nom-de-fonction>:
args:
- <arg1>
- <arg2>
kwargs:
arg1: val1
arg2: val2
Note : le nom de fonction fonctionne avec des correspondances partielles. Cela signifie que vous pouvez utiliser un nom de fonction comme 'describe_' et les arguments spécifiés seront injectés dans toutes les fonctions contenant 'describe_'. Les règles sont appliquées sur la base de la première trouvée ; donc si vous souhaitez remplacer une règle générique, placez votre règle plus spécifique au-dessus de la règle générique. Ex. :
ec2:
- describe_instances
args:
kwargs:
DryRun: True
NoPaginate: True
- describe_
args:
kwargs:
DryRun: True
Les nouvelles règles peuvent être ajoutées soit en modifiant le fichier CustomTests.yaml existant, soit en créant un nouveau fichier YAML et en le spécifiant avec le drapeau --custom-tests. Le nouveau fichier sera fusionné avec le fichier de tests existant et toute valeur en double sera écrasée, le fichier fourni ayant la priorité.
Le fournisseur AWS est écrit comme une bibliothèque pour l'intégration dans d'autres outils. Vous pouvez l'utiliser comme suit :
import boto3
from cloudprivs.providers.aws import service
from concurrent.futures import ThreadPoolExecutor
session = boto3.Session('default')
with ThreadPoolExecutor(15) as executor:
iam = service.Service('iam', session, executor=executor)
scan_results = iam.scan() # couvrira toutes les régions listées dans l'executor (toutes les régions disponibles par défaut)
formatted_results iam.pretty_print_scan(scan_results)
print(formatted_results)
Tout est entièrement documenté dans le code, cela devrait être assez facile à comprendre.
Cet outil est fonctionnel mais loin d'être complet. Je travaille activement sur de nouvelles fonctionnalités et je suis ouvert aux contributions, donc n'hésitez pas à ouvrir des issues/demandes de fonctionnalités et à envoyer des PR.
Fonctionnalités prévues