欢迎来到CI工具一周教程的第三天。我们将研究黑客是如何攻击和滥用CI工具的。
今天是第三天的课程,其他课程如下所示:
第一天 - Jenkins(和Hudson) 第二天 - TeamCity 第三天 - Go和CruiseControl 第四天 - 通用攻击工具集和工具集的使用 第五天 - 防御措施和讨论其他一些事
第三天我们将重点讲Go。Go是一个开源的CI工具,可以在这里找到。跟之前讨论的CI工具一样,Go也支持分布式构建。
Go主要存在如下问题:
1.默认安装后没有启用身份认证 2.没有抵御暴力破解攻击的措施 3.对用户密码没有复杂度要求 4.在Windows上以系统或更高的权限运行(大部分的配置需要有管理员权限)
不幸的是,使用Go的公共实例不是很多,所以无法推测它们到底泄露了多少信息。几乎所有外网能访问到的Go服务器我都进行了测试,然后我发现它们内部经常不使用任何身份认证机制。
为了能以系统权限来做一些有趣的事,我们首先要获取Pipeline组管理员(非系统管理员)的权限。这里我没有找到能够枚举用户的办法,所以需要进行一些社工的工作,主要对象是目标企业内部的开发人员、源码管理团队和支持团队。社工的内容我不打算在这里详述,所以直接假设我们已经拿到了Pipeline组管理员的账户了。
命令执行
拥有在Pipeline中增加或编辑作业的权限后,我们就可以以系统权限执行命令了。我们需要配置一个运行用户自定义命令的作业。配置请参阅配置文档。
命令的输出是这样的:
很好!又是系统权限!
现在让我们来看下如何使用PowerShell脚本建立反向连接。由于Go可能不是最好的CI工具导致Go公共实例比较少,为了演示我们只使用ICMP通信进行反向连接。我们使用Nishang的Invoke-PowerShellIcmp脚本。为了建立ICMP反向连接,我们还需要在Linux上使用icmpsh suite进行监听。具体可以参见我之前的文章。在开启监听后,我们可以修改Invoke-PowerShellIcmp移除帮助信息只依靠脚本本身来进行调用,现在我们使用Nishang的Invoke-Encode来对它进行压缩和Base64编码。最后,这个自定义命令被执行的效果如下:
在监听端的效果如下:
很好,我们获得了一个ICMP反向shell!
移除安全措施
如果我们有在主节点上增加或编辑作业的权限,我们就可以移除Go服务器上所有的安全措施。我们可以将cruise-config.xml文件从Go的安装目录下移除,也可以只移除cruise-config.xml文件部分内容,然后在增加一个用户到没移除的部分中。在修改完后必须要重启Go服务。这样所有通过url访问的用户都具有管理员权限。
下面这段代码可以直接移除Go服务的安全措施(删除cruise-config.xml文件并重启Go服务):
cmd /c powershell -c del 'C:\Program Files (x86)\Go Server\config\cruise-config.xml' cmd /c powershell –c Restart-Service 'Go Server'
明文存储的凭证
SSH密钥是以明文形式存储的。一个在主节点上具有可以配置作业权限的用户就可以读取到这些密钥。这些密钥在Windows上存储在:C:/Program Files (x86)/Go Server/%HOMEDRIVE%%HOMEPATH%/.ssh
,在Linux上存储在/var/go/.ssh
。
另一个有趣的安全问题是,Go在创建用户时允许基于文件进行身份认证。详情请参见配置文档。而这个文件中的密码是一个不加盐进行Base64编码后的SHA-1值。鉴于Go对用户密码没有复杂度的要求,所以我们不难从加密后的密码中破解出明文密码。如果Go开启了基于文件的认证,那么我们可以在cruise-config.xml中找到文件的路径"passwordFile path"。
CruiseControl
CruiseControl在.NET和Ruby里有广泛的应用,可以在这里获取到。尽管CruiseControl是一个比较古老的软件但在我的渗透测试中还是会经常看到,下面让我们快速的了解下CruiseControl。
默认情况下CruiseControl没有启用认证。我们可以通过在调度分类中增加一个"exec"构建来执行命令。执行后的结果可以在CruiseControl的/dashboard面板和/cruisecontrol面板上看到。
Google Dorks
下面的Google Dorks可以找到Go的公共实例(但数量很少):
Public instances: intitle:"Go - Login" inurl:go/auth/ Public instances with no authentication: intitle:"Administration - Go" inurl:/go/admin Public instances of CruiseControl: intitle:"CruiseControl - Dashboard"
反序列化漏洞
Go在2015年11月9日已经修复了这个漏洞,详情请参见:http://www.go.cd/2015/11/09/deserialization-vulnerability-commons-collections.html
对于CruiseControl来说,实际上是存在反序列化漏洞的,但是我完全没有兴趣去进行测试。
*原文:labofapenetrationtester xiaix编译,转自须注明来自FreeBuf黑客与极客(FreeBuf.COM)