- 攻击元数据服务:在云环境中,元数据即表示实例的相关数据,可以用来配置或管理正在运行中的实例。攻击通过SSRF去访问元数据中存储的临时密钥或者用于自启动实例的启动脚本,这些脚本可能会包含AK、密码、源码等等,然后根据从元数据服务获取的信息,攻击者可尝试获取到受害者账户下COS、CVM、集群等服务的权限。具体攻击方式如下图所示:
- 攻击Kubelet API:在云环境中,可通过Kubelet API查询集群pod和node的信息,也可通过其执行命令。为了安全考虑,此服务一般不对外开放。但是,攻击者可以通过SSRF去访问Kubelet API,获取信息和执行命令。具体攻击方式如下图所示:
- 攻击Docker Remote API:Docker Remote API是一个取代远程命令行界面(rcli)的REST API,默认开放端口为2375。此API如果存在未授权访问,则攻击者可以利用其执行docker命令,获取敏感信息,并获取服务器root权限。因此为了安全考虑,一般不会在外网开放,此时我们就可以通过SSRF去尝试攻击那些不对外开放的Docker Remote API。其过程与攻击Kubelet API类似。
- 越权攻击云平台内其他组件或服务:由于云上各组件相互信任,当云平台内某个组件或服务存在SSRF漏洞时,就可通过此漏洞越权攻击其他组件或者服务。如下图所示,用户正常请求服务A时,云API层会对请求进行校验,其中包括身份、权限等。如果服务A存在SSRF漏洞,则可构造请求使服务A访问服务B,因为服务A与服务B互相信任,所以服务B未校验服务A的请求,从而越权操作服务B的资源。
当我们需要通过URL发送用户名和密码时,可以使用
http://username:password@www.xxx.com,此时@前的字符会被当作用户名密码处理,@后面的字符才是我们请求的地址,即http://qq.com@127.0.0.1/与http://127.0.0.1/请求时是相同的,而这种方法有时可以绕过系统对地址的检测。
图7-利用@符号绕过利用进制转换绕过开发人员在提取或者过滤域名或者IP时,未考虑到IP的进制转换的影响,则存在被利用进制转换绕过的可能。浏览器不仅可以识别正常的IP地址,也可以识别八进制、十进制、十六进制等其他进制的IP地址,但是有时候开发人员会忽视这一点,因此有时,我们可以通过这一点去绕过防护。进制转换可以通过在线网站或者工具脚本完成,下面列举常用十进制和十六进制的例子。十进制http://127.0.0.1/->http://2130706433/图8-利用十进制绕过十六进制:http://127.0.0.1/->http://0x7F000001/图9-利用十六进制绕过注意:16进制使用时一定要加0x,不然浏览器无法识别,八进制使用的时候要加0利用30X跳转绕过开发人员在进行SSRF防护时,未考虑到30X跳转的影响,则存在被利用30X跳转绕过的可能。服务器发请求的时候,一般会跟随30X接着访问跳转后的网址,而开发人员有时候会忽略这一点,在防护的时候只对第一次请求的链接进行检测,从而忽略了跳转后的链接,因此可以通过这种方式去尝试绕过系统的防护。下面附上一个302跳转的python脚本。使用方法:python 302.py port 跳转地址图10-302跳转绕过图11-302跳转绕过利用短网址绕过开发人员在进行SSRF防护时,未考虑到短网址的影响,则存在被利用短网址绕过的可能。短网址本质上是一种302跳转,但是短网址字符长度一般都比较短,其中有的短网址域名可能还做过认证,在某些时候被信任的可能比个人申请的域名会高一点,且网上都有搭建好的服务,方便快捷。因此本文将短网址绕过也单独列为一种方法。图12-利用短网址绕过图13-短网址绕过利用域名解析服务绕过开发人员在构建SSRF防护时,只考虑到了域名,没有考虑到域名解析后的IP,则存在被利用域名解析服务来绕过的可能。此类服务有一个功能就是将xxx.127.0.0.1.xxx.xx解析成127.0.0.1,并且此类服务一般在互联网上都是可以免费使用,十分方便。因此有时候也可以尝试利用此种方法去绕过系统的防护。图14-利用域名解析服务绕过图15-利用域名解析服务绕过利用添加端口的方式绕过开发人员在提取或者过滤域名或者IP时,未考虑到端口端口对IP格式的影响,则存在被通过添加端口绕过的可能,如http://127.0.0.1->http://127.0.0.1:80。下图是笔者利用python的正则例举的一种可能存在的情况。图16-利用添加端口的方式绕过利用将自己的域名解析到目标内网IP的方式绕过上文讲的利用域名解析服务去绕过SSRF防护,我们也可通过自己购买域名,然后将其解析都某个内网,达到同样的效果。但是有的时候,这种方法也能做到一些域名解析服务做不到的事情。假设现在有这样一个功能,此功能的作用是先把用户输入的域名存储起来,等需要的时候再去调用。而开发人员只在输入的时候,对域名和域名解析后的IP做了校验,而真正调用的时候,未做任何校验,这个时候我们就可以先将域名解析到某个外网IP上,等存储完成之后,真正需要调用的时候再将其解析到内网的目标IP上。利用对象存储回源功能绕过在遇到302跳转绕过时,除了上述的两种方法之外,还有一种利用对象存储本身的回源功能进行绕过的方法。下面笔者会介绍如何去使用这种方法:(1)新建一个存储桶;图17-新建存储桶(2)设置权限为公有读私有写,其他的默认即可;图18-新建公有读私有写存储桶(3) 开启静态网站;图19-开启静态网站(4)在回源设置处添加回源规则;图20-添加回源地址(5)协议配置页面,默认404即可触发回源,也可以自己添加关键字触发,类似于https://xxx.com/key,key为触发的关键字,其他的默认即可;图21-配置http状态码(6)源站设置页面,回源地址填写要访问的地址,这块限制了内网地址,抓包修改成完整的请求(xxx.com/xxx),即可绕过,或者绑定好自己的域名后,再将其解析到内网地址。其他的根据需要填写。图22-配置回源地址(7)设置好之后,在可能存在ssrf的地方填上静态网站的地址即可。利用DNS重绑定(DNS Rebinding)绕过在上文中,笔者介绍了一种通过手动更改域名解析的方式绕过SSRF防护的方法,但是如果开发人员在调用的时候也进行了检测呢,这样还有办法绕过吗,答案是可以的。可以通过DDNS重绑定的方式去进行绕过。在介绍DNS重绑定之前,我们先看下服务器从获取一个URL,到发起请求,都会经历哪些步骤。首先,系统会取到用户输入的URL,并从该URL中提取host;然后,系统会对该host进行DNS解析,获取到解析的IP;接着会对该IP进行检测,检测该IP是否是合法的,比如是否是私有IP等;最后,如果IP检测为合法的,则进入curl的阶段发包。在这个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间差,利用这个时间差,我们可以在第一次去请求DNS服务进行域名解析时,返回一个正常的IP,而在第二次服务端去请求URL时,让DNS解析到内网IP,这时候就可以绕过系统对于SSRF的防护。这就是DNS Rebinding。具体原理如下:#!/usr/bin/env python3
import sys
from http.server import HTTPServer, BaseHTTPRequestHandler
if len(sys.argv)-1 != 2:
print("""
Usage: {} <port_number> <url>
""".format(sys.argv[0]))
sys.exit()
Redirect(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(302)
self.send_header('Location', sys.argv[2])
self.end_headers()
def send_error(self, code, message=None):
self.send_response(302)
self.send_header('Location', sys.argv[2])
self.end_headers()
HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()
- 服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP;
- 对于获得的IP进行判断,发现为非黑名单IP,则通过验证;
- 服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址;
- 由于已经绕过验证,所以服务器端返回访问内网资源的结果。
参考文献
1.https://cloud.tencent.com/developer/article/1668008
2.https://security.tencent.com/index.php/blog/msg/179
3.https://github.com/1135/notes/blob/master/web_vul_SSRF.md
4.https://mp.weixin.qq.com/s/0wdxfetcp8TUtLZFWI16uA
5.https://zhuanlan.zhihu.com/p/73736127
6.http://byd.dropsec.xyz/2017/11/21/SSRF%E7%BB%95%E8%BF%87%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93/
7.https://www.shuzhiduo.com/A/LPdoepLgJ3/
8.http://blog.leanote.com/post/snowming/e2c24cf057a4
9.https://mp.weixin.qq.com/s/Y9CBYJ_3c2UI54Du6bneZA
10.https://www.freebuf.com/articles/web/179910.html
11.https://sirleeroyjenkins.medium.com/just-gopher-it-escalating-a-blind-ssrf-to-rce-for-15k-f5329a974530
网友留言: