当对外发起请求时,会存在一个安全限制,比如去检测IP地址,去访问自己是不是127.0.0.1,相当于去访问内网段是192.168以及172网段。这种内网有非常明显的一个特征的,有不同的过滤存在,有的时候为了去绕过这些过滤,需要做出一些对应的方法以及策略去实现。
1、添加一个端口
限制情况下不允许纯IP的形式,默认情况下IP是80端口,比如访问的是99端口是可以的,一个加端口的操作,就可能去突破它的规则限制,当于可以绕过它对IP做限制。
2、短网址
短网址相当于把正常网址进行压缩,这个网址对应的真实地址访问一下,发现它就跳转到如下页面,如果这里不允许IP地址输入,比如说旧网址把它缩短,访问时submit会这样提示:
假设可以发起SSRF请求,这里放这个请求,我们注意看它的整个网络解决过程会发现有个301跳转。
其实相当于去访问一个站,其中有跳转的过程。默认情况下,是不开启功能。
3、指向任意IP的域名xip.io
比如这里明显是一个IP地址,会解析到域名下的一个二级域名。比如说我这个地方去拷贝一下出来换成127.0.0.1,这里也会解析到127.0.0.1。
第1步是拿到网址,然后做DNS解析请求,DNS解析之后它返回的IP地址就是服务器真实想访问的地方,用短网址访问真实服务器地址会返回。
4、IP限制绕过
在八进制十六进制等相互转化中会发现非常明显的有点来做判断,在判断IP的时候这个点就是一个特征值。可以先转换成十六进制整数形式,再转换成十进制整数形式,通过这样的方式去实现IP地址的转化,这些表示的都是localhost127.0.0.1这同一个IP地址,会发现它有这么多的形式。
刚才讲到了302跳转与file协议利用,配合curl的时候也是有一个使用的。file协议能够读文件等,gopher协议俗称万能协议。
比如说我这里跟了一个百度,后面跟一个@192.168.0.1/的时候,是否有权访问,这里有个交互过程,实际上不清楚能不能利用,但是确实有这个方法存在,可作了解。
通过gopher发get和post请求时,我们可以先去截获get post请求包,然后再去构造一个符合发出协议的请求。它可以发出get post,是SSRF中非常强大的一个协议书,称万能协议,而且它是有区别的,我们知道get post的协议它就是发一个回一个,gopher相当于能够一次性把你的整个都发过去。
1、Redis反弹shell
Redis是非关系型数据库,gopher对Redis的应用是有场景限制的。首先,既然是对Redis应用,Redis的特征是没密码,相当于使用的时候不需要登录,这个场景提到的是一个反弹shell能够执行命令,要配合一个场景相当于是定时任务在执行。整个流程就是通过Redis去写一个定时任务,定时任务去执行反弹回来。如果外面存在一个web服务,肯定要存在SSRF,利用的就是gopher协议,去利用gopher协议去对Redis发起请求,通过Redis是去写一个定时任务,历史任务执行之后,打出来,打出来的地方,我们可以在里面去写一个反弹shell,所以就是通过web上面的SSRF利用gopher协议,往这个里面去写一个定时任务。如果用Redis去写一个反弹shell,当前场景即可满足。
相当于1是没有,下面两个场景,第1个是去掉Redis。存在一个Redis因为看到6379端口,你会看到一个Redis-server。
看它的语法结构,其实你会发现它就是site 1然后config。
我这边再敲一下定时任务语句,然后输出一个就是这样子的一个。其实我们这个我们先不管它,我们先看这句话好了,这句话它其实就是一个反弹shell。
这边的定时任务,你会看到它能够实现一个反弹shell
以上过程是Redis去写一个定时任务,然后你注意到我写的定时任务是root其实这个跟我当前用户有关,同名的文件叫root那么它会把它里面的任务当作定时任务去执行的,随意命名是不会去执行的。用curl来实现写入,如果说php这个函数中的后面内容可控,是可以对自己发起一个请求。我们主要讲如何去转化gopher协议,用gopher协议的话,就是说刚才我们PPT中提到,首先去捕获我们发出的请求,再把它转化成gopher协议。
相当于做个中间的一个段落操作,你先把它发送到那里,然后这边再把它转送到6379默认的口,这边就会拿到它中间的那些内容,然后我们就能够对中间的内容做操作了。然后你会注意到上面shell脚本,其实就是对Redis的那些一系列的命令操作。执行shell的时候是点IP一个端口,这个端口号肯定是和fork的这个口是一致的。
2、流量转发
所以的话我们可以来看一下,我这边的话就不是4444了,就变成3333号,IP就要换成IP 206.12.37.37,端口号换成2444。socat的转发肯定也是在当前容器中去做转发的,然后我们socat的去做一个端口转发
这时候再把数据给复制出来,接下来要利用脚本进行做一个转换。其实这种像我经常讲的都是一种缺陷,不能说是一个漏洞,是一种场景结合。这边就利用它这个脚本,比如说我这边的socat的命令抓出来了,我这里保存一下,然后再用工具我去执行一下。那他这个时候就会有gopher协议,一部分协议就会出来了,我们就拿到了一个请求内容,我们就可以利用这个协议去尝试着发出请求。
3、转化脚本
比如说你要改的地方,肯定是一个反弹需要弹回来的地址,用这个地方的内容改对应IP,长度发生变化加减就OK了。直接去生成的话,其实更稳妥一点,我这边的话最重要执行一下。拿到监听端口2444-LVP监听,执行一下发现可以返回,再到CARSP到C这个目录下看一下这个地方有这个文件生成,定时任务已经写入。
1、安装Redis然后cron,案例中使用的环境是centos,如果是ubantu的是自带的,但是我当时试的时候其实没有成功,用centos装Redis,然后cron,socat这三个。
2、centos中默认自带的curl,版本上不支持gopher协议,用软链接去覆盖掉这个curl。如果要用php代码来实现这个gopher协议可能就需要用高版本,或者在centos下重新编译才可以。
本文作者:牛油果 1472301220
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/124118.html