之前在LevelUP会议上演讲了《Doing Recon Like a Boss》,之后在HackerOne上发布了一篇同样主题的博文。所以我决定开始在公开应用上寻找漏洞来验证那个方法论是否同样适用。作为整个实践过程序的一部分,我决定去瞧瞧Slack和Snapchat的赏金程序,并按之前演讲中那样实施侦察。
对于大型的赏金程序来说,子域名爆破是个经典的切入口,但不幸的是我所发现的域名没有什么意思,我就是想找到一些看起来有意思的事。
那接着开始第二阶段吧。
亚马逊算不上一个好的切入点,但从snapchat的外观来看可得知它是高度依赖google的,除此之外他们在HackOne的赏金程序说明中提到他们的app是托管在google的。
所以不要在s3 buckets上浪费时间了,去看看其他的地方还有些什么。
作为侦察的一部分,我通常是去寻找已知或公开的漏洞。我快速浏览了他们的活动踪迹,有了下面这些发现
“sc-cdn.net” and “sc-corp.net” 引起了我的注意。
我的第一反应是子域名爆破,但这不是在开玩笑么。这些都是corp和cdn域名,更有可能的是大多数有趣的子域名更可能是独立的形式。
现在的问题是如何找到它们?
通常好的开始是从Censys.io上寻找网站证书入手。在censys上,我通常去查询看起来像这样的东西:
443.https.tls.certificate.parsed.extensions.subject_alt_name.dns_names:domain.com
这足够我找到一些有意思的子域名了,这些域名通过暴力破解是无法找到的。现在来看下找到的结果,有这么一个子域名:REDACTED-jenkins-Environment.sc-corp.net指向了登录的用户能够查看网站内容。在这个时候,我怀疑这上面是否会有生产环境,甚至可能存在更多内容等待我们去探寻.为了提快速度,我将这个清单“dev, alpha, stage, prod, beta, local, test”配合脚本来寻找不同组合的REDACTED-jenkins-$env.sc-corp.net域名.正如预期的那样,其中一些返回的是302作为其响应代码,这意味它们可能在登录请求的背后。
我最初的想法是去尝试访问生产环境然后尝试登陆,接着我去实践了这个想法,才发现这并没有作用。所以,让我们跳到清单上的下一个项,在其他实例上同样进行一样的尝试。现在才是所有乐趣的开始。我运气真是好到爆了。我发现有个实例允许我使用gmail账号登陆到JenKins上。现在我被授权登陆上了它们的Jenkins生产环境上,但我不认为我有足够的权限去做我想要做的事情,更别说让我访问控制台了。这个时候,我在Jenkins上运行了一个脚本并能读取到服务器文件,接着立马停止了深入的测试并向Snapchat团队报告了这个问题。可能有人会疑惑,为什么不进一步演示。因为我可以读取系统上的任意文件,所以进一步的演示是不必要的。为了展示远程命令执行,我列出了允许命令执行的脚本并要求他们自行尝试。现在暂时先不讨论这些脚本,后面再聊。
我写这篇文章不是来谈论提交给Snapchat团队的报告,因为通过阅读在HackerOne上仅有的公开报告和一些基本调查就能猜测到大部分的信息。我写这篇文章的目的是想深入一点利用Jenkins,同时和大家探讨下这个漏洞是否真的价值2万美元。
为了演示这些,我使用自己的Jenkins实例来演示不同的攻击场景(截图与提交给Snapchat的报告无关系)
CVE-2016-9299 – Jenkins ‘Java Deserialization’ Remote Code Execution Vulnerability.
CVE-2015-8103 – Jenkins CLI – RMI Java Deserialization (Exploit)
通常拥有了访问Jenkins内容权限,就相当于拥有访问凭证、API_KEYS,密钥甚至是源码的权限。
Jenkins允许设置不同的插件,比如Github的OAuth凭证,你可以用来控制用户登录你的组织,这可能导致你的Github token泄漏。
接着可以通过Github的API来获取更多的数据。
比如: https://api.github.com/orgs/ORG_NAME/repos?access_token=XXXXX
正如前面所提到的,脚本控制台允许使用一行代码读取文件:
你可以通过执行下面的操作在服务器上执行命令:
def sout = new StringBuilder(), serr = new StringBuilder()
def proc = 'ls /etc/'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"
关键点:
他们人也很好,同意我写了这篇文章。
感谢阅读,享受hacking吧。