
Определение привилегий из облачных учетных данных путем брутфорс-тестирования.
У меня есть учетные данные, что дальше?
CloudPrivs — это инструмент, который использует существующую мощь SDK, таких как Boto3, для перебора прав доступа всех облачных сервисов и определения того, какие привилегии существуют для заданного набора учетных данных.
Этот инструмент полезен для пентестеров, участников красных команд и других специалистов по безопасности. Облачные сервисы обычно не предоставляют способа определить, какие разрешения есть у заданного набора учетных данных, а огромное количество сервисов и операций делает ручное подтверждение сложной задачей. Это означает, что повышение привилегий может быть возможным с использованием набора учетных данных, но об этом можно никогда не узнать, просто потому что неизвестно, что найденные учетные данные AWS могут выполнять Lambda.
В настоящее время недоступно на PyPi, но я работаю над этим
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m pip install -e .
Это без виртуального окружения и не рекомендуется, если вы запускаете много программ на Python.
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m venv venv/
./venv/bin/activate # activate.ps1 в Windows
python -m pip install -e .
Вы также можете использовать Pyenv+virtualenv, если они доступны:
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
pyenv virtualenv CloudPrivs
pyenv local CloudPrivs
python -m pip install -e .
cloudprivs [ПОСТАВЩИК] [АРГУМЕНТЫ]
В настоящее время доступен только AWS, но я работаю над GCP. Если вы хотите помочь, смотрите #Customizing.
Опции:
-v, --verbose Показывать неудачные и ошибочные тесты в выводе
-s, --services TEXT Тестировать только указанные сервисы, а не все доступные
-p, --profile TEXT Имя профиля AWS для сканирования, если не указано, будут использованы переменные окружения
-t, --custom-tests FILENAME Расположение файла YAML с пользовательскими тестами. Читайте документацию для получения дополнительной информации
-r, --regions TEXT Список фильтров для сопоставления регионов, например "us", "eu-west", "ap-north-1"
--help Показать это сообщение и выйти.
Для --region и --service поддерживаются несколько аргументов, но они должны передаваться с флагом каждый раз, т.е. cloudprivs aws -r us -r eu -s ec2 -s lambda. Мне это тоже не нравится, но это ограничение Click, для которого я пока не нашел обходного пути.
Обратите внимание, что флаг
regionподдерживает частичное совпадение. Наиболее часто используемые аргументы:-r us -r eu, чтобы охватить только общие регионы.
Результаты отображаются, сгруппированные по регионам, и каждая строка содержит тестовый случай и результат теста.
Если инструмент сталкивается с неожиданными ошибками во время тестирования, они выводятся в stderr по мере возникновения, что может прерывать поток вывода. Если вы не хотите их видеть, можно перенаправить stderr.
В отличие от других инструментов, таких как WeirdAAL, которые вручную пишут каждый тестовый случай, CloudPrivs напрямую запрашивает SDK Boto3, чтобы динамически сгенерировать список всех доступных сервисов и всех доступных регионов для каждого сервиса.
После формирования полного списка каждая функция вызывается по умолчанию без аргументов, хотя поддерживается возможность добавления пользовательских аргументов для каждой операции (подробнее в #Customizing).
Примечание: некоторые функции AWS могут повлечь затраты при вызове. Я разрешил только операции, начинающиеся с
get_,list_иdescribe_, чтобы избежать случайных затрат, что в моем собственном тестировании оказалось безопасным. Однако, пожалуйста, используйте с осторожностью. Это кажется безопасным для других инструментов, таких как enumerate-iam. Я не гарантирую, что вы случайно не понесете затраты при вызове всех этих функций (даже без аргументов).
CloudPrivs поддерживает простое расширение/настройку в двух областях:
Реализовать нового поставщика (например, GCP) просто:
CloudPrivs/providers создайте новую папку для вашего поставщика (например, 'gcp').CloudPrivs/providers/__init__.py добавьте вашего поставщика в переменную __all__, она должна совпадать с именем папки.cli.py в папке вашего поставщика.cli (см. поставщика AWS для справки).cloudprivs <поставщик> должен показывать ваш CLI.Поставщик AWS поддерживает внедрение аргументов при вызове функций AWS. Эта функция предоставляется, потому что часто функции AWS требуют аргументов для вызова, и в некоторых случаях эти аргументы могут быть фиксированными переменными. Таким образом, если мы можем предоставить фиктивные переменные, мы увеличиваем покрытие тестирования. В других случаях мы можем внедрить аргументы, такие как dryrun=true, чтобы ускорить вызовы.
Пользовательские тесты хранятся в файле YAML по адресу cloudprivs/providers/aws/CustomTests.yaml.
Структура YAML следующая:
---
<имя-сервиса>:
- <имя-функции>:
args:
- <арг1>
- <арг2>
kwargs:
arg1: val1
arg2: val2
Примечание: имя функции работает с частичным совпадением. Это означает, что вы можете использовать имя функции, например 'describe_', и указанные аргументы будут внедрены во все функции, содержащие 'describe_'. Правила сопоставляются по принципу «первое найденное», поэтому если вы хотите переопределить общее правило, разместите более конкретное правило выше общего. Например:
ec2:
- describe_instances
args:
kwargs:
DryRun: True
NoPaginate: True
- describe_
args:
kwargs:
DryRun: True
Новые правила можно добавить, изменив существующий файл CustomTests.yaml или создав новый файл YAML и указав его с помощью флага --custom-tests. Новый файл будет объединен с существующим файлом тестов, и любые дублирующиеся значения будут переопределены, при этом приоритет отдается предоставленному файлу.
Поставщик AWS написан как библиотека для интеграции в другие инструменты. Вы можете использовать его следующим образом:
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() # охватит все регионы, указанные в executor (по умолчанию все доступные регионы)
formatted_results = iam.pretty_print_scan(scan_results)
print(formatted_results)
Всё полностью задокументировано в коде, должно быть достаточно просто для понимания.
Этот инструмент функционален, но далек от завершения. Я активно работаю над новыми функциями и открыт для вклада, поэтому, пожалуйста, не стесняйтесь открывать Issues/Feature Requests и отправлять PR.
Запланированные функции