Оригинальное исследование: Блог 0xPwN — Создание лаборатории уязвимостей Azure: Часть #1 — Анонимный доступ к блобам
«Учетные записи хранения» — это услуга, предоставляемая Azure для хранения данных в облаке. Учетная запись хранилища может использоваться для хранения:
- блобов
- файловые ресурсы
- Таблицы
- Очереди
- Диски виртуальных машин
В этом руководстве мы сосредоточимся на разделе «Блоки». Блобы хранятся в контейнере, и у нас может быть несколько контейнеров в одной учетной записи хранилища. Когда мы создаем контейнер, Azure запрашивает разрешения, которые мы предоставляем для публичного доступа. Мы можем выбирать между:
- Частный доступ — анонимный доступ запрещен
- Доступ к блобам — мы можем получить анонимный доступ к блобам, если знаем полный URL (имя контейнера + имя блоба).
- Доступ к контейнеру — мы можем получить анонимный доступ к блобам, если мы знаем имя контейнера (включена возможность просмотра списка каталогов, и мы можем видеть все файлы, хранящиеся внутри контейнера).
Как вы уже догадались, предоставлением разрешения Container Access можно легко воспользоваться для загрузки всех файлов, хранящихся в контейнере, без каких-либо разрешений, поскольку единственное, что требуется знать, это имя учетной записи хранилища и имя контейнера, которые можно перечислить с помощью списков слов.
Эксплуатация анонимного доступа к блобам
Существуют тысячи статей, объясняющих, как этим можно злоупотреблять и как искать небезопасные хранилища в Azure, но чтобы упростить ситуацию, я сделаю TL:DR. Один из самых простых способов — использовать MicroBurst, указать имя учетной записи хранилища для поиска, и он проверит, существуют ли контейнеры, на основе списка слов, сохраненного в Misc/permutations.txt:
PS > import-module .MicroBurst.psm1
PS> Invoke-EnumerateAzureBlobs -Base 0xpwnstorageacc
Found Storage Account - 0xpwnstorageacc.blob.core.windows.net
Found Container - 0xpwnstorageacc.blob.core.windows.net/public
Public File Available: https://0xpwnstorageacc.blob.core.windows.net/public/flag.txt
Альтернативный вариант — добавить ?restype=container&comp=list после имени контейнера:
https://<storage_account>.blob.core.windows.net/<container>?restype=container&comp=list
Выход:
<EnumerationResults ContainerName="https://0xpwnstorageacc.blob.core.windows.net/public">
<Blobs>
<Blob>
<Name>flag.txt</Name>
<Url>
https://0xpwnstorageacc.blob.core.windows.net/public/flag.txt
</Url>
<Properties>
<Last-Modified>Sat, 05 Mar 2022 18:02:14 GMT</Last-Modified>
<Etag>0x8D9FED247B7848D</Etag>
<Content-Length>34</Content-Length>
<Content-Type>text/plain</Content-Type>
<Content-Encoding/>
<Content-Language/>
<Content-MD5>lur6Yvd173x6Zl1HUGvtag==</Content-MD5>
<Cache-Control/>
<BlobType>BlockBlob</BlobType>
<LeaseStatus>unlocked</LeaseStatus>
</Properties>
</Blob>
</Blobs>
<NextMarker/>
</EnumerationResults>