在levelUp上发表完“Doing Recon Like a Boss”和更新了一篇Hackerone上同样主题的帖子后,我决定开始挖一些公开项目漏洞,看看这种方法是否仍然适用于公开项目。作为其中的一部分,我决定看看Slack和Snapchat的漏洞赏金项目,并按照演讲中描述的那样准确地完成侦察任务。
Step #1 –子域名爆破
子域收集通常在大型漏洞赏金项目中是一个好的开头,但不幸的是我发现的子域并不是很有趣,所以我决定找到更“有趣”的东西。跳到第二阶段。
Step #2 – Amazon网络服务(AWS)
Amazon一直都是一个不错的起点,但了解到的是Snapchat很大程度上依赖于Google,而且他们在Hackerone漏洞赏金项目中已经声明了他们的APP是托管在Google上的。那么我们不要继续在s3 buckets上浪费时间了,看看还有什么吧!
Step #3 – HackerOne上Snapchat的披露报告
作为侦察任务的一部分,我通常喜欢寻找已知或披露的漏洞。我快速浏览了一下他们的Hacktivity并发现如下内容:
– render.bitstrips.com
– blog.snapchat.com
– accounts.snapchat.com
– fastly.sc-cdn.net
– sc-corp.net(感谢Shubs)
“sc-cdn.net”和“sc-corp.net”都引起了我的注意。我的第一反应就是子域名爆破,但这是在自欺欺人。这些是corp / cdn域名,而且很有可能大多数这些有趣的子域名都有特定的模式。现在的问题是我该如何发现他们?
Step #4: Censys / Shodan
在Censys.io上查找证书一般是个很好的方式。通常我在censys上使用类似于这样的查询条件:
443.https.tls.certificate.parsed.extensions.subject_alt_name.dns_names:domain.com
在通过暴力破解不能找到有趣的子域名情况下,再用这种方法就足够了。通过这些结果,我发现了一个子域名:REDACTED-jenkins-Environment.sc-corp.net,该域名要求用户登录才能查看具体内容。这个时候,我想知道是否存在生产环境。肯定有很多,让我们找一下吧。为了加速我的进程,我用了能查找以下不同REDACTED-jenkins-$env.sc-corp.net序列列表的脚本:
“dev, alpha, stage, prod, beta, local,test”。正如我所期望的那样,其中一些结果返回了302响应码,这暗示他们可能需要登录。
Step #5:从这里我能干什么呢?
我最初的想法是很明显地尝试登录这个产品实例,但这并没有成功(感谢preben_ve)。因此,让我们下移列表,并在其他实例上尝试相同的方法。这就是所有乐趣开始的地方。算我幸运,我发现的其中一个实例允许我使用gmail帐户登录到Jenkins实例。现在,我已经通过了它们的Jenkins实例身份验证,我认为它可能只给了最小的权限允许我做一些事情,更不用说允许我访问“Script Console(脚本控制台)”了。这时候,我运行了一个允许我从这台服务器读取一份文件的脚本,然后立刻停止所有测试并将细节提交给了Snapchat团队。没有必要执行其他脚本来证明影响,因为我已经可以读取系统上的任意文件了。为了证明RCE(远程代码执行),我在报告中包含了一份允许执行命令的脚本,并要求他们自己冒险进行测试。我们晚一点儿讨论这些脚本。
Step #6:利用Jenkins漏洞
我写这篇帖子不只是为了讨论我提交给Snapchat的报告,因为其实大多数信息能通过我在HackerOne上的限制公开披露并做一些简单的侦察猜到。我写这篇帖子的目的是深入探讨利用Jenkins的漏洞,并讨论它是否真的值2万美元。为了实现这个目的,我用自己的Jenkins实例来演示不同的攻击场景(截图与我提交给Snapchat的报告无关):
Example #1:已知漏洞(只是为了突出一些)
CVE-2016-9299– Jenkins Java 反序列化远程代码执行漏洞
CVE-2015-8103– Jenkins CLI – RMI Java 反序列化(Exploit)
Example #2:访问构建信息:
通常有权访问Jenkins的构建信息则说民可能会让你访问凭据,api_keys / secrets这里是源码:
Example #3:插件
Jenkins
允许你安装不同的插件,比如Github OAuth,你可以允许用户使用你的组织进行登录,这可能泄露你的Github令牌:
使用Github API可以访问更多数据。比如:https://api.github.com/orgs/ORG_NAME/repos?access_token=XXXXX
Example #4: Groovy脚本
正如我之前提到的,脚本控制台允许你使用一行代码来读取文件:
通过以下代码你也能在这台服务器上执行一条命令:
def sout = new StringBuilder(), serr = new StringBuilder()
def proc = 'ls /etc/'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"
关键点:
1. Jenkins允许你有不同的用户权限。这意味着你得通过Jenkins实例登录认证,它不保证你可以执行远程代码。
2.如果需要通过Github或Google OAuth认证,不要被吓到。
3.你的访问权限可能有限(没有脚本,构建信息等),但是你可以访问“People”列表中的用户。这也许能让你通过暴力破解的方式获取登录凭证(我没有那么极端)。
4.通常Jenkins被用于部署,所以查一下IP,主机名等。如果你拿下了Jenkins而且想进一步测试(在漏洞赏金项目中尽量避免,完全没必要而且会违反大多数项目规则),值得注意的是Jenkins服务器最有可能有权限访问生产环境或内网环境。在运行的服务器上找找私钥和主机。
5.不要在你的报告中使用“公开可访问的Jenkins”,除非你可以利用上面的一个或多个例子。
6. Snapchat立刻移除了这个实例并奖励了我。他们也非常友善地同意我写这篇关于这个漏洞的帖子。
感谢阅读,挖洞愉快!