Продолжим тему поиска уязвимостей AWS S3. В предыдущей статье мы говорили о получение содержимого бакетов AWS с помощью AWS CLI. Сегодня рассмотрим перечисление и эксфильтрация бакетов AWS S3.
Еще по теме: Взлом удаленного хоста через Git
Перечисление и эксфильтрация бакетов AWS S3
Не стоит забывать про бакеты, даже если у нас уже есть доступ в AWS. Ведь именно в бакетах постоянно встречаются файлы конфигурации, кукбуки, скрипты, необработанные данные, а иногда даже бэкапы баз данных.
AWS CLI
Начинаем всегда с перечисления доступных бакетов:
1 |
aws s3api list-buckets |
Теперь можем изучить все ACL, настроенные на бакет:
1 |
aws s3api get-bucket-acl --bucket |
Например:
1 |
aws s3api get-bucket-acl --bucket buckettest |
Несложно догадаться, что Grantee — объект, которому выдаются права.
Настоящий хакер должен быть незаметным, как ниндзя. Поэтому обязательно проверяйте, ведутся ли логи у атакуемого бакета:
1 |
aws s3api get-bucket-logging --bucket <имя бакета> |
Например:
1 |
aws s3api get-bucket-logging --bucket buckettest |
Если логирования нет, вывода не будет.
Если же логирование присутствует, AWS CLI уведомит нас об этом.
В данном случае все логи доступа к бакету buckettestlogging будут лежать в бакете siteru.
Обязательно посмотрите и политику, привязанную к бакету:
1 |
aws s3api get-public-access-block --bucket |
Например:
1 |
aws s3api get-public-access-block --bucket buckettest |
Политики бывают следующие:
- BlockPublicAcls — если true, то предотвращает создание любых ACL или изменение существующих ACL, дающих публичный доступ к бакету;
- IgnorePublicAcls — если true, то любые действия с общедоступными ACL будут игнорироваться; это не помешать их создать, но предотвратит последствия;
- BlockPublicPolicy — если true, то ставится запрет на создание или изменение политики, которая разрешает публичный доступ;
- RestrictedPublicBuckets — если true, то к бакету смогут получить доступ лишь авторизованные пользователи. Собственно, из‑за этого параметра я и советовал вам указывать данные любой учетной записи AWS.
Наконец, получаем все объекты в определенном бакете:
1 |
aws s3api list-objects-v2 --bucket |
Пример:
1 |
aws s3api list-objects-v2 --bucket siteru |
Также вы можете получить информацию об ACL конкретного объекта:
1 |
aws s3api get-object-acl --bucket --key |
Пример:
1 2 |
aws s3api get-object-acl --bucket siteru --key aws.txt aws s3api get-object-acl --bucket siteru --key folder1/aws.txt |
Эксфильтрация
Чтобы достать данные из бакета, нам требуется доступ на чтение (READ).
Давайте повторим пройденное. Как вы уже поняли, самый частый мисконфиг — всем пользователям предоставляются права на чтение. В таком случае мы можем найти адрес бакета и прочитать его содержимое даже без аутентификации.
Также бывает, что права на чтение есть лишь у авторизованных пользователей либо у одного конкретного пользователя. В таком случае мы сможем получить доступ к содержимому через API или CLI. Наконец, доступ к бакету можно получить, используя специально сгенерированную временную ссылку.
Полезно также смотреть размеры бакета и опись содержимого:
1 |
aws s3api list-objects --bucket <имя бакета> --output json --query "[sum(Contents[].Size), length(Contents[])]" |
Пример:
1 |
aws s3api list-objects --bucket flaws.cloud --output json --query "[sum(Contents[].Size), length(Contents[])]" |
Как скачивать отдельный объект с помощью get-object либо весь бакет с помощью sync, мы уже разобрали. Теперь обратим внимание на временную ссылку для скачивания объектов. Любой, кто имеет валидные учетные данные и доступ к бакету, может создать ее:
1 |
aws s3 presign s3:/// --expires-in <время в секундах> |
Пример:
1 |
aws s3 presign s3://siteru/Site001.pdf --expires-in 604800 |
В следующей статье поговорим о повышении привилегий при пентесте AWS S3 Buckets.
РЕКОМЕНДУЕМ: