
Модульный набор инструментов для атак, использующий REST API Azure DevOps для разведки, повышения привилегий и закрепления с использованием украденных куки или PAT.
# ADOKit
## Описание
Azure DevOps Services Attack Toolkit — ADOKit — это набор инструментов для атаки на Azure DevOps Services с использованием доступного REST API. Инструмент позволяет пользователю указать модуль атаки, а также действительные учетные данные (ключ API или украденный cookie аутентификации) для соответствующего экземпляра Azure DevOps Services. Поддерживаемые модули атаки включают разведку, повышение привилегий и закрепление. ADOKit был построен по модульному принципу, чтобы в будущем сообщество по информационной безопасности могло добавлять новые модули.
Полные сведения о техниках, используемых ADOKit, приведены в [документе](https://www.ibm.com/downloads/cas/5JKAPVYD) X-Force Red.
### Black Hat USA Arsenal 2024
Слайды презентации и демонстрации включены в папку [BHUSA Arsenal 2024](https://github.com/h4wkst3r/adokit/blob/main/BHUSA_Arsenal_2024) в этом репозитории.
## Релиз
* Версия 1.4.1 ADOKit доступна в разделе Releases
## Содержание
- [ADOKit](#ADOKit)
- [Содержание](#table-of-contents)
- [Установка/Сборка](#installationbuilding)
- [Используемые библиотеки](#libraries-used)
- [Предварительно скомпилированная версия](#pre-compiled)
- [Сборка самостоятельно](#building-yourself)
- [Модули команд](#command-modules)
- [Аргументы/Параметры](#argumentsoptions)
- [Способы аутентификации](#authentication-options)
- [Таблица сведений о модулях](#module-details-table)
- [Примеры](#examples)
- Разведка
- [Проверить доступ к Azure DevOps](#validate-azure-devops-access)
- [Whoami](#whoami)
- [Список организаций](#List-orgs)
- [Список репозиториев](#List-repos)
- [Поиск репозиториев](#Search-repos)
- [Список проектов](#list-projects)
- [Поиск проектов](#search-projects)
- [Поиск кода](#Search-code)
- [Поиск файлов](#Search-files)
- [Список пользователей](#list-users)
- [Поиск пользователя](#search-user)
- [Список команд](#list-teams)
- [Поиск команды](#search-team)
- [Получить участников команды](#get-team-members)
- [Список групп](#list-groups)
- [Поиск групп](#search-groups)
- [Получить участников группы](#get-group-members)
- [Получить разрешения проекта](#get-project-permissions)
- [Поиск учетных данных](#creds-search)
- [Получить журналы сборок](#get-build-logs)
- [Список журналов сборок](#list-build-logs)
- [Поиск в журналах сборок](#search-build-logs)
- Закрепление
- [Создать PAT](#create-pat)
- [Список PAT](#list-pats)
- [Удалить PAT](#remove-pat)
- [Создать SSH-ключ](#create-ssh-key)
- [Список SSH-ключей](#list-ssh-keys)
- [Удалить SSH-ключ](#remove-ssh-key)
- Повышение привилегий
- [Добавить администратора проекта](#add-project-admin)
- [Удалить администратора проекта](#remove-project-admin)
- [Добавить администратора сборок](#add-build-admin)
- [Удалить администратора сборок](#remove-build-admin)
- [Добавить администратора коллекции](#add-collection-admin)
- [Удалить администратора коллекции](#remove-collection-admin)
- [Добавить администратора сборок коллекции](#add-collection-build-admin)
- [Удалить администратора сборок коллекции](#remove-collection-build-admin)
- [Добавить учетную запись службы сборок коллекции](#add-collection-build-service-account)
- [Удалить учетную запись службы сборок коллекции](#remove-collection-build-service-account)
- [Добавить учетную запись службы коллекции](#add-collection-service-account)
- [Удалить учетную запись службы коллекции](#remove-collection-service-account)
- [Получить переменные конвейера](#get-pipeline-variables)
- [Получить секреты конвейера](#get-pipeline-secrets)
- [Получить группы переменных](#get-variable-groups)
- [Получить подключения служб](#get-service-connections)
- [Обнаружение](#detection)
- [План развития](#roadmap)
- [Ссылки](#references)
## Установка/Сборка
### Используемые библиотеки
В этом проекте используются следующие сторонние библиотеки.
| Библиотека | URL | Лицензия |
| ------------- | ------------- | ------------- |
| Fody | [https://github.com/Fody/Fody](https://github.com/Fody/Fody) | MIT License |
| Newtonsoft.Json | [https://github.com/JamesNK/Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) | MIT License |
### Предварительно скомпилированная версия
* Используйте предварительно скомпилированный бинарный файл из релизов
### Сборка самостоятельно
Выполните следующие шаги, чтобы настроить Visual Studio для самостоятельной компиляции проекта. Для этого требуются две библиотеки .NET, которые можно установить из менеджера пакетов NuGet.
* Загрузите проект Visual Studio и перейдите в "Tools" --> "NuGet Package Manager" --> "Package Manager Settings"
* Перейдите в "NuGet Package Manager" --> "Package Sources"
* Добавьте источник пакетов с URL-адресом `https://api.nuget.org/v3/index.json`
* Установите пакет NuGet Costura.Fody.
* `Install-Package Costura.Fody -Version 3.3.3`
* Установите пакет Newtonsoft.Json
* `Install-Package Newtonsoft.Json`
* Теперь вы можете самостоятельно собрать проект!
## Модули команд
* Разведка
* <b>check</b> - Проверить, использует ли организация Azure DevOps и действительны ли учетные данные
* <b>whoami</b> - Вывести текущего пользователя и его членство в группах
* <b>listorgs</b> - Вывести список доступных или всех организаций в Azure DevOps
* <b>listrepo</b> - Вывести список всех репозиториев
* <b>searchrepo</b> - Искать заданный репозиторий
* <b>listproject</b> - Вывести список всех проектов
* <b>searchproject</b> - Искать заданный проект
* <b>searchcode</b> - Искать код, содержащий поисковый запрос
* <b>searchfile</b> - Искать файл по поисковому запросу
* <b>listuser</b> - Вывести список пользователей
* <b>searchuser</b> - Искать заданного пользователя
* <b>listteam</b> - Вывести список команд
* <b>searchteam</b> - Искать заданную команду
* <b>getteammembers</b> - Получить участников заданной команды
* <b>listgroup</b> - Вывести список групп
* <b>searchgroup</b> - Искать заданную группу
* <b>getgroupmembers</b> - Вывести список всех участников заданной группы
* <b>getpermissions</b> - Получить разрешения для доступа к заданному проекту
* <b>creds</b> - Искать учетные данные в коде (ключевые слова перечислены ниже)
* ``` "pw OR pwd OR passwrod OR password OR \"-----BEGIN PGP PRIVATE KEY BLOCK-----\" OR \"-----BEGIN EC PRIVATE KEY-----\" OR \"-----BEGIN DSA PRIVATE KEY-----\" OR \"-----BEGIN OPENSSH PRIVATE KEY-----\" OR \"-----BEGIN RSA PRIVATE KEY-----\" OR ANSIBLE_VAULT OR AWS_ACCESS_KEY_ID OR AWS_SECRET_ACCESS_KEY OR ACCESS_TOKEN OR API_KEY OR Authorization OR db_password" ```
* <b>getbuildlogs</b> - Загрузить журналы сборок для одного или всех проектов
* <b>listbuildlogs</b> - Вывести список журналов сборок для одного или всех проектов
* <b>searchbuildlogs</b> - Искать в журналах сборок по заданному поисковому запросу
* Закрепление
* <b>createpat</b> - Создать персональный токен доступа для пользователя
* <b>listpat</b> - Вывести список персональных токенов доступа для пользователя
* <b>removepat</b> - Удалить персональный токен доступа для пользователя
* <b>createsshkey</b> - Создать открытый SSH-ключ для пользователя
* <b>listsshkey</b> - Вывести список открытых SSH-ключей для пользователя
* <b>removesshkey</b> - Удалить открытый SSH-ключ для пользователя
* Повышение привилегий
* <b>addprojectadmin</b> - Добавить пользователя в группу "Project Administrators" для заданного проекта
* <b>removeprojectadmin</b> - Удалить пользователя из группы "Project Administrators" для заданного проекта
* <b>addbuildadmin</b> - Добавить пользователя в группу "Build Administrators" для заданного проекта
* <b>removebuildadmin</b> - Удалить пользователя из группы "Build Administrators" для заданного проекта
* <b>addcollectionadmin</b> - Добавить пользователя в группу "Project Collection Administrators"
* <b>removecollectionadmin</b> - Удалить пользователя из группы "Project Collection Administrators"
* <b>addcollectionbuildadmin</b> - Добавить пользователя в группу "Project Collection Build Administrators"
* <b>removecollectionbuildadmin</b> - Удалить пользователя из группы "Project Collection Build Administrators"
* <b>addcollectionbuildsvc</b> - Добавить пользователя в группу "Project Collection Build Service Accounts"
* <b>removecollectionbuildsvc</b> - Удалить пользователя из группы "Project Collection Build Service Accounts"
* <b>addcollectionsvc</b> - Добавить пользователя в группу "Project Collection Service Accounts"
* <b>removecollectionsvc</b> - Удалить пользователя из группы "Project Collection Service Accounts"
* <b>getpipelinevars</b> - Извлечь все переменные конвейера для заданного проекта.
* <b>getpipelinesecrets</b> - Извлечь имена всех секретов конвейера для заданного проекта.
* <b>getvariablegroups</b> - Извлечь все группы переменных и соответствующие переменные, используемые для заданного проекта.
* <b>getserviceconnections</b> - Извлечь подключения служб, используемые для заданного проекта.
## Аргументы/Параметры
* <b>/credential:</b> - учетные данные для аутентификации (PAT или Cookie). Применимо ко всем модулям.
* <b>/url:</b> - URL-адрес Azure DevOps. Применимо ко всем модулям.
* <b>/search:</b> - Ключевое слово для поиска. Применимо не ко всем модулям.
* <b>/project:</b> - Проект, для которого выполняется действие. Применимо не ко всем модулям.
* <b>/user:</b> - Выполнить действие для указанного пользователя. Применимо не ко всем модулям.
* <b>/id:</b> - Используется с модулями закрепления для выполнения действия с заданным идентификатором токена. Применимо не ко всем модулям.
* <b>/group:</b> - Выполнить действие для указанной группы. Применимо не ко всем модулям.
## Способы аутентификации
Ниже перечислены способы аутентификации, доступные в ADOKit при подключении к экземпляру Azure DevOps.
* **Украденный cookie - UserAuthentication** - Это будет cookie `UserAuthentication` на машине пользователя для домена `.dev.azure.com`.
* `/credential:UserAuthentication=ABC123`
* **Украденный cookie - AadAuthentication** - Это будет cookie `AadAuthentication` на машине пользователя для домена `.dev.azure.com`.
* `/credential:eyJ0...`
* **Персональный токен доступа (PAT)** - Это будет токен доступа/ключ API в виде одной строки.
* `/credential:apiToken`
* **Украденный токен доступа** - Если вы можете украсть или обновить подходящий токен доступа, вы также можете использовать его. При использовании токена доступа он должен быть действителен для ресурса Azure Resource Manager (ARM) - `"aud":"https://management.core.windows.net/"` или Azure Devops - `"aud":"499b84ac-1321-427f-aa17-267ca6975798"`
* `/credential:eyJ0..`
## Таблица сведений о модулях
В приведенной ниже таблице указаны разрешения, необходимые для каждого модуля.
Сценарий атаки | Модуль | Особые разрешения? | Примечания
--- |--- | --- | ---
Разведка | `check` | Нет |
Разведка | `whoami` | Нет |
Разведка | `listorgs` | Нет |
Разведка | `listrepo` | Нет |
Разведка | `searchrepo` | Нет |
Разведка | `listproject` | Нет |
Разведка | `searchproject` | Нет |
Разведка | `searchcode` | Нет |
Разведка | `searchfile` | Нет |
Разведка | `listuser` | Нет |
Разведка | `searchuser` | Нет |
Разведка | `listteam` | Нет |
Разведка | `searchteam` | Нет |
Разведка | `getteammembers` | Нет |
Разведка | `listgroup` | Нет |
Разведка | `searchgroup` | Нет |
Разведка | `getgroupmembers` | Нет |
Разведка | `getpermissions` | Нет |
Разведка | `creds` | Нет |
Разведка | `getbuildlogs` | Да - `Contributors` или `Readers` или `Build Administrators` или `Project Administrators` или `Project Team Member` или `Project Collection Test Service Accounts` или `Project Collection Build Service Accounts` или `Project Collection Build Administrators` или `Project Collection Service Accounts` или `Project Collection Administrators` |
Разведка | `listbuildlogs` | Да - `Contributors` или `Readers` или `Build Administrators` или `Project Administrators` или `Project Team Member` или `Project Collection Test Service Accounts` или `Project Collection Build Service Accounts` или `Project Collection Build Administrators` или `Project Collection Service Accounts` или `Project Collection Administrators` |
Разведка | `searchbuildlogs` | Да - `Contributors` или `Readers` или `Build Administrators` или `Project Administrators` или `Project Team Member` или `Project Collection Test Service Accounts` или `Project Collection Build Service Accounts` или `Project Collection Build Administrators` или `Project Collection Service Accounts` или `Project Collection Administrators` |
Закрепление | `createpat` | Нет |
Закрепление | `listpat` | Нет |
Закрепление | `removepat` | Нет |
Закрепление | `createsshkey` | Нет |
Закрепление | `listsshkey` | Нет |
Закрепление | `removesshkey` | Нет |
Повышение привилегий | `addprojectadmin` | Да - `Project Administrator`, `Project Collection Administrator` или `Project Collection Service Accounts` |
Повышение привилегий | `removeprojectadmin` | Да - `Project Administrator`, `Project Collection Administrator` или `Project Collection Service Accounts` |
Повышение привилегий | `addbuildadmin` | Да - `Project Administrator`, `Project Collection Administrator` или `Project Collection Service Accounts` |
Повышение привилегий | `removebuildadmin` | Да - `Project Administrator`, `Project Collection Administrator` или `Project Collection Service Accounts` |
Повышение привилегий | `addcollectionadmin` | Да - `Project Collection Administrator` или `Project Collection Service Accounts` |
Повышение привилегий | `removecollectionadmin` | Да - `Project Collection Administrator` или `Project Collection Service Accounts` |
Повышение привилегий | `addcollectionbuildadmin` | Да - `Project Collection Administrator` или `Project Collection Service Accounts` |
Повышение привилегий | `removecollectionbuildadmin` | Да - `Project Collection Administrator` или `Project Collection Service Accounts` |
Повышение привилегий | `addcollectionbuildsvc` | Да - `Project Collection Administrator`, `Project Colection Build Administrators` или `Project Collection Service Accounts` |
Повышение привилегий | `removecollectionbuildsvc` | Да - `Project Collection Administrator`, `Project Colection Build Administrators` или `Project Collection Service Accounts` |
Повышение привилегий | `addcollectionsvc` | Да - `Project Collection Administrator` или `Project Collection Service Accounts` |
Повышение привилегий | `removecollectionsvc` | Да - `Project Collection Administrator` или `Project Collection Service Accounts` |
Повышение привилегий | `getpipelinevars` | Да - `Contributors` или `Readers` или `Build Administrators` или `Project Administrators` или `Project Team Member` или `Project Collection Test Service Accounts` или `Project Collection Build Service Accounts` или `Project Collection Build Administrators` или `Project Collection Service Accounts` или `Project Collection Administrators` |
Повышение привилегий | `getpipelinesecrets` | Да - `Contributors` или `Readers` или `Build Administrators` или `Project Administrators` или `Project Team Member` или `Project Collection Test Service Accounts` или `Project Collection Build Service Accounts` или `Project Collection Build Administrators` или `Project Collection Service Accounts` или `Project Collection Administrators` |
Повышение привилегий | `getvariablegroups` | Да - `Contributors` или `Readers` или `Build Administrators` или `Project Administrators` или `Project Team Member` или `Project Collection Test Service Accounts` или `Project Collection Build Service Accounts` или `Project Collection Build Administrators` или `Project Collection Service Accounts` или `Project Collection Administrators` |
Повышение привилегий | `getserviceconnections` | Да - `Project Administrator`, `Project Collection Administrator` или `Project Collection Service Accounts` |
## Примеры
### Проверить доступ к Azure DevOps
#### Вариант использования
> *Выполнить проверку аутентификации, чтобы убедиться, что организация использует Azure DevOps и что предоставленные учетные данные действительны.*
#### Синтаксис
Укажите модуль `check`, а также соответствующую информацию об аутентификации и URL-адрес. Будет выведено, использует ли предоставленная организация Azure DevOps, и если да, то будет предпринята попытка проверить предоставленные учетные данные.
`ADOKit.exe check /credential:apiKey /url:https://dev.azure.com/organizationName`
`ADOKit.exe check /credential:"UserAuthentication=ABC123" /url:https://dev.azure.com/organizationName`
#### Пример вывода```
C:\>ADOKit.exe check /credential:apiKey /url:https://dev.azure.com/YourOrganization
==================================================
Module: check
Auth Type: API Key
Search Term:
Target URL: https://dev.azure.com/YourOrganization
Timestamp: 3/28/2023 3:33:01 PM
==================================================
[*] INFO: Checking if organization provided uses Azure DevOps
[+] SUCCESS: Organization provided exists in Azure DevOps
[*] INFO: Checking credentials provided
[+] SUCCESS: Credentials provided are VALID.
3/28/23 19:33:02 Finished execution of check
```
### Whoami
#### Вариант использования
> *Получить текущего пользователя и его членство в группах*
#### Синтаксис
Укажите модуль `whoami`, вместе с соответствующими данными аутентификации и URL. Это выведет текущего пользователя и все его членства в группах.
`ADOKit.exe whoami /credential:apiKey /url:https://dev.azure.com/organizationName`
`ADOKit.exe whoami /credential:"UserAuthentication=ABC123" /url:https://dev.azure.com/organizationName`
#### Пример вывода```
C:\>ADOKit.exe whoami /credential:"UserAuthentication=ABC123" /url:https://dev.azure.com/YourOrganization
==================================================
Module: whoami
Auth Type: Cookie
Search Term:
Target URL: https://dev.azure.com/YourOrganization
Timestamp: 4/4/2023 11:33:12 AM
==================================================
[*] INFO: Checking credentials provided
[+] SUCCESS: Credentials provided are VALID.
Username | Display Name | UPN
------------------------------------------------------------------------------------------------------------------------------------------------------------
jsmith | John Smith | [email protected]
[*] INFO: Listing group memberships for the current user
Group UPN | Display Name | Description
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[YourOrganization]\Project Collection Test Service Accounts | Project Collection Test Service Accounts | Members of this group should include the service accounts used by the test controllers set up for this project collection.
[TestProject2]\Contributors | Contributors | Members of this group can add, modify, and delete items within the team project.
[MaraudersMap]\Contributors | Contributors | Members of this group can add, modify, and delete items within the team project.
[YourOrganization]\Project Collection Administrators | Project Collection Administrators | Members of this application group can perform all privileged operations on the Team Project Collection.
4/4/23 15:33:19 Finished execution of whoami
```
### Список организаций
#### Сценарий использования
> *Получение организаций с использованием заданного токена доступа.*
#### Синтаксис
Предоставьте модулю `listorgs` необходимую информацию для аутентификации. По умолчанию эта команда выводит только те организации, которые доступны с помощью указанного токена доступа.
- Используйте **`/mode:aad`** для перечисления **всех** организаций DevOps в арендаторе Azure AD, независимо от прямого доступа.
- Используйте **`/endpoint:ENDPOINT_NAME`** для указания пользовательской конечной точки AEX.
- Дополнительные конечные точки можно определить, проверив cookie `"X-VSS-DeploymentAffinity"` из `aex.dev.azure.com`.
`ADOKit.exe listorgs /credential:"eyj0..." [/mode:aad] [/endpoint:ENDPOINT_NAME]`
`ADOKit.exe listorgs /credential:"eyj0..." /mode:aad /endpoint:aexprodeus21`
#### Пример вывода```
C:\>ADOKit.exe listorgs /credential:"eyj0..."
==================================================
Module: listorgs
Auth Type: Azure Access Token
Target URL: https://app.vssps.visualstudio.com
Timestamp: 3/14/2025 2:26:45 PM
==================================================
[*] INFO: Checking credentials provided
[+] SUCCESS: Credentials provided are VALID.
Organization ID | Organization Name
-----------------------------------------------------------------------------------
390a7474-e2f2-4b98-b538-4a547fa9f5e3 | solar-devops
b63b999f-43f2-48c5-998d-b31cbf4c2f8e | lunar-devops
```
### List Repos
#### Use Case
> *Обнаружение репозиториев, используемых в экземпляре Azure DevOps*
#### Syntax
Укажите модуль `listrepo` вместе с соответствующей информацией для аутентификации и URL. Это выведет имя репозитория и URL.
`ADOKit.exe listrepo /credential:apiKey /url:https://dev.azure.com/organizationName`
`ADOKit.exe listrepo /credential:"UserAuthentication=ABC123" /url:https://dev.azure.com/organizationName`
#### Example Output```
C:\>ADOKit.exe listrepo /credential:UserAuthentication=ABC123 /url:https://dev.azure.com/YourOrganization
==================================================
Module: listrepo
Auth Type: Cookie
Search Term:
Target URL: https://dev.azure.com/YourOrganization
Timestamp: 3/29/2023 8:41:50 AM
==================================================
[*] INFO: Checking credentials provided
[+] SUCCESS: Credentials provided are VALID.
Name | URL
-----------------------------------------------------------------------------------
TestProject2 | https://dev.azure.com/YourOrganization/TestProject2/_git/TestProject2
MaraudersMap | https://dev.azure.com/YourOrganization/MaraudersMap/_git/MaraudersMap
SomeOtherRepo | https://dev.azure.com/YourOrganization/ProjectWithMultipleRepos/_git/SomeOtherRepo
AnotherRepo | https://dev.azure.com/YourOrganization/ProjectWithMultipleRepos/_git/AnotherRepo
ProjectWithMultipleRepos | https://dev.azure.com/YourOrganization/ProjectWithMultipleRepos/_git/ProjectWithMultipleRepos
TestProject | https://dev.azure.com/YourOrganization/TestProject/_git/TestProject
3/29/23 12:41:53 Finished execution of listrepo
```
### Поиск репозиториев
#### Сценарий использования
> *Поиск репозиториев по имени в экземпляре Azure DevOps*
#### Синтаксис
Предоставьте модуль `searchrepo` и критерии поиска в аргументе командной строки `/search:`, вместе с соответствующей информацией аутентификации и URL. Это выведет имя и URL совпадающего репозитория.
`ADOKit.exe searchrepo /credential:apiKey /url:https://dev.azure.com/organizationName /search:cred`
`ADOKit.exe searchrepo /credential:"UserAuthentication=ABC123" /url:https://dev.azure.com/organizationName /search:cred`
#### Пример вывода```
C:\>ADOKit.exe searchrepo /credential:apiKey /url:https://dev.azure.com/YourOrganization /search:"test"
==================================================
Module: searchrepo
Auth Type: API Key
Search Term: test
Target URL: https://dev.azure.com/YourOrganization
Timestamp: 3/29/2023 9:26:57 AM
==================================================
[*] INFO: Checking credentials provided
[+] SUCCESS: Credentials provided are VALID.
Name | URL
-----------------------------------------------------------------------------------
TestProject2 | https://dev.azure.com/YourOrganization/TestProject2/_git/TestProject2
TestProject | https://dev.azure.com/YourOrganization/TestProject/_git/TestProject
3/29/23 13:26:59 Finished execution of searchrepo
```
### Список проектов
#### Вариант использования
> *Обнаружение проектов, используемых в экземпляре Azure DevOps*
#### Синтаксис
Укажите модуль `listproject`, а также соответствующую информацию аутентификации и URL. Это выведет имя проекта, видимость (открытый или закрытый) и URL.
```
---
[Read more](https://github.com/h4wkst3r/adokit)