任务实施:
E044-服务漏洞利用及加固-利用redis未授权访问漏洞进行提权
任务环境说明:
服务器场景:p9_kali-6(用户名:root;密码:toor)
服务器场景操作系统:Kali Linux 192.168.32.123
服务器场景:p9_linux-6(用户名:root;密码:123456)
服务器场景操作系统:Linux 192.168.32.147
---------------------------------------------------------------------------------------------------------------------------------
实验等级:
中级
任务场景:
【任务场景】
磐石公司邀请渗透测试人员对该公司内网进行渗透测试,由于企业网络管理员的疏忽,为了更方便的管理直接使用未开启授权访问redis服务器作为后台数据服务器,小王向管理员告知了该情况并还原黑客的攻击场景,介绍一些常用的攻击方法和安全知识。
任务分析:
【任务分析】
Redis因配置不当可以导致未授权访问,被攻击者恶意利用。当前流行的针对Redis未授权访问的一种新型攻击方式,在特定条件下,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器,可导致服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务。
预备知识:
【预备知识】
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、 Key-Value数据库。和Memcached类似,它支持存储的value 类型相对更多,包括 string(字符串)、list ( 链表)、 set(集合)、zset(sorted set – 有序集合)和 hash(哈希类型)。这些数据类型都支持push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上, redis支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave (主从)同步。
部分服务器上的Redis 绑定在 0.0.0.0:6379,并且没有开启认证(这是Redis 的默认配置),以及该端口可以通过公网直接访问,如果没有采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,将会导致 Redis 服务直接暴露在公网上,可能造成其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。
有关Redis的相关知识
1、 Redis的数据类型:
字符串、列表(lists)、集合(sets)、有序集合(sorts sets)、哈希表(hashs)
2、Redis和memcache相比的独特之处:
(1)redis可以用来做存储(storge)、而memcache是来做缓存(cache)。这个特点主要是因为其有“持久化”功能
(2)存储的数据有“结构”,对于memcache来说,存储的数据,只有一种类型——“字符串”,而redis则可以存储字符串、链表、集合、有序集合、哈希结构
3、持久化的两种方式:
Redis将数据存储于内存中,或被配置为使用虚拟内存。
实现数据持久化的两种方式:
(1)使用截图的方式,将内存中的数据不断写入磁盘(性能高,但可能会引起一定程度的数据丢失)
(2)使用类似mysql的方式,记录每次更新的日志
4、Redis的主从同步:对提高读取性能非常有益
5、Redis服务端的默认端口是6379
---------------------------------------------------------------------------------------------------------------------------------
网络拓扑
---------------------------------------------------------------------------------------------------------------------------------
实战复现
在进行实验前,首先在靶机中使用命令iptables -F清空所有表链,然后使用命令service iptables save,保存对当前防火墙条例的修改,再然后回到渗透机中使用命令nmap -n -A -p 6379 --script redis-info 172.16.1.6通过nmap对服务器进行端口扫描信息,Redis默认使用的6379端口
靶机操作:
iptables -F
service iptables save
回到渗透机
nmap -n -A -p 6379 --script redis-info 192.168.32.147
———————————————————————————————————————————
来到渗透机
可以发现当前服务器没有开启redis服务,那么我们进入到靶机中去打开该服务。
———————————————————————————————————————————
进入靶机编辑/usr/local/redis/etc/redis.conf,编辑第69行,将bind后的地址改为0.0.0.0,并修改第88行的protected-mode yes改为no,最后修改507行将requirepass admin前面加上#
vi /usr/local/redis/etc/redis.conf
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
小技巧:
进入源码文件后,代码太多怎么办?不急,vim编辑器有自带的搜索符号
进入vim编辑器后 ,默认是阅读模式,按i或o键进入编辑模式
在阅读模式输入" / "号,后面跟上需要搜索的字符串,回车即可搜到。
看下面的例子:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
然后使用命令/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf启动redis服务器
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
———————————————————————————————————————————
———————————————————————————————————————————
回到渗透,再次使用渗透机nmap进行端口扫描:
这里靶机的IP波动了一下,并无大碍:
Nmap扫描后发现靶机的6379端口对所有开放,是可以用本地Redis去远程连接靶机服务器来获取Redis敏感数据(redis在开放往外网的情况下(默认配置是bind 127.0.0.1,只允许本地访问,如果配置了其他网卡地址那么就可以网络访问),默认配置下是空口令,端口为6379)。
实验结束,关闭虚拟机。